Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ? / 25 сообщений из 40, страница 1 из 2
21.01.2014, 20:05:31
    #38533649
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
hi all

Дано: таблица ts(x int), 95 млн строк. FB в режиме SuperClassic'a.

var-1:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SQL> set stat on;
SQL> select count(*) from ts;

                COUNT
=====================
             94879606

Current memory = 144729656
Delta memory = 0
Max memory = 144802088
Elapsed time=  52.29 sec 
Cpu = 0.00 sec
Buffers = 16384
 Reads = 582442
Writes = 0
Fetches = 190923738 

var-2.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> set explain on; set stat on;
SQL> select max(c) from (select count(x)over() c from ts);

Select Expression
    -> Aggregate
        -> Window
            -> Record Buffer
                -> Table "TS" Full Scan

                  MAX
=====================
             94879606

Current memory = 144838072
Delta memory = 0
Max memory = 153228088
Elapsed time=  282.54 sec 
Cpu = 0.00 sec
Buffers = 16384
 Reads = 582442
Writes = 0
Fetches = 190923738 

Во втором варианте ФБ должен сформировать окно и затолкать во все его строки результат count(*)over() - т.е. выполнить сначала проход по таблице, а затем по "строкам" окна.
Статистику манипуляций с окном - её можно где-то увидеть ?
...
Рейтинг: 0 / 0
21.01.2014, 21:48:14
    #38533736
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
Хм.
У меня под Windows вот этой строчки в статистике нет

Код: plaintext
Cpu = 0.00 sec

Код: plaintext
1.
2.
3.
4.
5.
ISQL Version: WI-T3.0.0.30854 Firebird 3.0 Alpha 2
Server version:
Firebird/Windows/AMD/Intel/x64 (access method), version "WI-T3.0.0.30854 Firebird 3.0 Alpha 2"
Firebird/Windows/AMD/Intel/x64 (remote server), version "WI-T3.0.0.30854 Firebird 3.0 Alpha 2/tcp (Den-PC)/P13:C"
Firebird/Windows/AMD/Intel/x64 (remote interface), version "WI-T3.0.0.30854 Firebird 3.0 Alpha 2/tcp (Den-PC)/P13:C"
on disk structure version 12.0
...
Рейтинг: 0 / 0
21.01.2014, 21:49:08
    #38533738
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
ТаблоидСтатистику манипуляций с окном - её можно где-то увидеть ?
нет, нельзя
...
Рейтинг: 0 / 0
21.01.2014, 22:35:08
    #38533769
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
Симонов ДенисУ меня под Windows вот этой строчки в статистике нетДык переходи быстрее на линух, тут гораздо больше инфы выдается! :-)
...
Рейтинг: 0 / 0
21.01.2014, 22:38:24
    #38533772
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
dimitrТаблоидСтатистику манипуляций с окном - её можно где-то увидеть ?нет, нельзяЛадно. Но почему такое различие во времени ? Окно не влезло в память (TempCacheLimit ?) и он его засвопил, или причина в другом ?
...
Рейтинг: 0 / 0
21.01.2014, 23:21:53
    #38533805
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
Симонов ДенисУ меня под Windows вот этой строчки в статистике нет

Код: plaintext
Cpu = 0.00 sec
Это время, затраченное клиентом. В нём есть какая-либо ценность ?
...
Рейтинг: 0 / 0
21.01.2014, 23:34:17
    #38533808
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
hvlad,

раз так то не особо
...
Рейтинг: 0 / 0
22.01.2014, 08:48:42
    #38533904
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
ТаблоидНо почему такое различие во времени ? Окно не влезло в память (TempCacheLimit ?) и он его засвопил, или причина в другом ?
а как 800МБ могло влезть в TempCacheLimit? :-)
...
Рейтинг: 0 / 0
22.01.2014, 12:42:58
    #38534163
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
dimitrТаблоидНо почему такое различие во времени ? Окно не влезло в память (TempCacheLimit ?) и он его засвопил, или причина в другом ?
а как 800МБ могло влезть в TempCacheLimit? :-)Что-то не взлетает каменный цветок.
Вот статистика при дефолтном TempCacheLimit (у мну Super Classic, так что это будет 8М):
294"
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
SQL> set stat on; out /dev/null; 
SQL> set explain on; select max(c) from (select count(x)over() c from ts); set explain off;

Select Expression
    -> Aggregate
        -> Window
            -> Record Buffer
                -> Table "TS" Full Scan

Current memory = 144725192
Delta memory = 508992
Max memory = 153115208
Elapsed time= 294.79 sec
Cpu = 0.00 sec
Buffers = 16384
Reads = 582815
Writes = 0
Fetches = 190924278

SQL> select max(c) from (select count(x)over() c from ts);
Current memory = 144725192
Delta memory = 0
Max memory = 153115208
Elapsed time= 293.61 sec
Cpu = 0.00 sec
Buffers = 16384
Reads = 582442
Writes = 0
Fetches = 190923738

SQL> select max(c) from (select count(x)over() c from ts);
Current memory = 144725192
Delta memory = 0
Max memory = 153115208
Elapsed time= 294.02 sec
Cpu = 0.00 sec
Buffers = 16384
Reads = 582442
Writes = 0
Fetches = 190923738

А вот что происходит при TempCacheLimit = 1024M:
446"
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
SQL> set stat on; out /dev/null; 
SQL> select max(c) from (select count(x)over() c from ts);
Current memory = 144744328
Delta memory = 204080
Max memory = 1218576968
Elapsed time= 456.31 sec
Cpu = 0.00 sec
Buffers = 16384
Reads = 582815
Writes = 0
Fetches = 190924278

SQL> select max(c) from (select count(x)over() c from ts);
Current memory = 144744328
Delta memory = 0
Max memory = 1218576968
Elapsed time= 446.74 sec
Cpu = 0.00 sec
Buffers = 16384
Reads = 582442
Writes = 0
Fetches = 190923738

SQL> select max(c) from (select count(x)over() c from ts);
Current memory = 144744328
Delta memory = 0
Max memory = 1218576968
Elapsed time= 446.18 sec
Cpu = 0.00 sec
Buffers = 16384
Reads = 582442
Writes = 0
Fetches = 190923738
...
Рейтинг: 0 / 0
22.01.2014, 12:56:01
    #38534184
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
А нельзя ли в статистике добавить насколько заполнен этот TempCache? Тогда было бы понятно попадают ли сортировки, хэш таблицы или материализованные таблицы в ОП или идут на диск.
...
Рейтинг: 0 / 0
22.01.2014, 13:19:18
    #38534220
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
Для tempCacheLimit = 768M результат тот же, что для 1024М.
Для 384М - около 380 сек.

Есть смутное сомнение, что временные данные для over()-функций храняется вообще не в TCL, а в какой-то области, размер которой уменьшается при увеличении TCL. Ибо увеличение TCL не просто бестолку, а приводит к ухудшению.
...
Рейтинг: 0 / 0
22.01.2014, 14:30:30
    #38534349
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
Симонов Денис,

да, это будет в статистике

Таблоид,

а если TempBlockSize увеличить раз в 10?
...
Рейтинг: 0 / 0
22.01.2014, 15:23:25
    #38534448
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
dimitrа если TempBlockSize увеличить раз в 10?Время перестало увеличиваться при увеличении TempCacheLimit. Но и не уменьшилось, застряло на одном значении :-(
var-1.
Код: plaintext
1.
TempBlockSize = 10M
TempCacheLimit = <default>
result:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SQL> set stat on; out /dev/null; select max(c) from (select count(x)over() c from ts); out;
Current memory = 144725200
Delta memory = 508992
Max memory = 153114864
Elapsed time=  282.06 sec 
Cpu = 0.00 sec
Buffers = 16384
Reads = 582815
Writes = 0
Fetches = 190924278

var-2.
Код: plaintext
1.
TempBlockSize = 10M
TempCacheLimit = 1024M
result:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQL> set stat on; out /dev/null; select max(c) from (select count(x)over() c from ts); out;
Current memory = 144725192
Delta memory = 508992
Max memory = 1218512776
Elapsed time=  288.32 sec 
Cpu = 0.00 sec
Buffers = 16384
Reads = 582815
Writes = 0
Fetches = 190924278
...
Рейтинг: 0 / 0
22.01.2014, 15:26:59
    #38534460
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
ТаблоидНо и не уменьшилось, застряло на одном значении
значит, так дорого обходится постоянное копирование записей в/из temp space
...
Рейтинг: 0 / 0
22.01.2014, 15:28:54
    #38534465
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
ну и конечно же не надо сравнивать с count(*), сам знаешь почему. count(x) будет честнее.
...
Рейтинг: 0 / 0
22.01.2014, 15:59:32
    #38534526
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
dimitrТаблоидНо и не уменьшилось, застряло на одном значениизначит, так дорого обходится постоянное копирование записей в/из temp spaceмда, печалько :(
На SS тоже самое, около 285 сек (при TempCacheLimit=1024m, TempBlockSize=10m).
А ведь по сути, он должен делать вот это:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
SQL> create table tmp(c int); commit;
SQL> set stat on; insert into tmp(c) select count(x) from ts; select max(c) from (select t.c from ts, tmp t);
Current memory = 144714952
Delta memory = 497712
Max memory = 144786408
Elapsed time= 59.62 sec
Cpu = 0.00 sec
Buffers = 16384
Reads = 582828
Writes = 0
Fetches = 190924342

         MAX
============
    94879606

Current memory = 144724192
Delta memory = 9240
Max memory = 144786408
Elapsed time= 57.42 sec
Cpu = 0.00 sec
Buffers = 16384
Reads = 582444
Writes = 3
Fetches = 190923746
...
Рейтинг: 0 / 0
22.01.2014, 16:50:15
    #38534635
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
я понял. ему надо более 2.3 Гб для окна, и еще для сортировки 120 Мб.

Вот этот скрипт-логгер:
Код: plaintext
1.
2.
3.
4.
5.
6.
log=fbtempspaceusage_$(date +'%Y%m%d_%H%M%S').log
while :
do
 supertee -tan $log lsof -a +L1 /
 sleep 1
done
- выдаст для запроса
Код: sql
1.
set stat on; select * from (select count(distinct x)over() c from ts) rows 1;

следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Wed Jan 22 16:43:00 2014: COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NLINK     NODE NAME
Wed Jan 22 16:43:00 2014: firebird 8842 firebird    4u   REG    8,4 14680064     0 12591707 /tmp/fb_recbuf_qGPdqs (deleted)
Wed Jan 22 16:43:01 2014: COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NLINK     NODE NAME
Wed Jan 22 16:43:01 2014: firebird 8842 firebird    4u   REG    8,4 29360128     0 12591707 /tmp/fb_recbuf_qGPdqs (deleted)
Wed Jan 22 16:43:02 2014: COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NLINK     NODE NAME
Wed Jan 22 16:43:02 2014: firebird 8842 firebird    4u   REG    8,4 41943040     0 12591707 /tmp/fb_recbuf_qGPdqs (deleted)
. . .
Wed Jan 22 16:47:40 2014: COMMAND   PID     USER   FD   TYPE DEVICE   SIZE/OFF NLINK     NODE NAME
Wed Jan 22 16:47:40 2014: firebird 8842 firebird    4u   REG    8,4 2306867200     0 12591707 /tmp/fb_recbuf_qGPdqs (deleted)
Wed Jan 22 16:47:40 2014: firebird 8842 firebird    5u   REG    8,4  119537664     0 12591719 /tmp/fb_sort_ruYAsF (deleted)
Wed Jan 22 16:47:41 2014: COMMAND   PID     USER   FD   TYPE DEVICE   SIZE/OFF NLINK     NODE NAME
Wed Jan 22 16:47:41 2014: firebird 8842 firebird    4u   REG    8,4 2306867200     0 12591707 /tmp/fb_recbuf_qGPdqs (deleted)
Wed Jan 22 16:47:41 2014: firebird 8842 firebird    5u   REG    8,4  119537664     0 12591719 /tmp/fb_sort_ruYAsF (deleted)


2 dimitr: какое макс. значение TempCacheLimit понимает ФБ на 64-разрядной арх-ре ?
...
Рейтинг: 0 / 0
22.01.2014, 16:57:55
    #38534648
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
Поставил TempCacheLimit = 2047M, логгер temp-свопа показал, ес-сно, уменьшение на почти 2 Гб:
Код: plaintext
1.
2.
3.
COMMAND    PID     USER   FD   TYPE DEVICE  SIZE/OFF NLINK     NODE NAME
firebird 17788 firebird    4u   REG    8,4 228589568     0 12591707 /tmp/fb_recbuf_O15uWa (deleted)
firebird 17788 firebird    5u   REG    8,4 125829120     0 12591719 /tmp/fb_sort_lXWVL1 (deleted)
- но статистика всё равно хреновая (в сравнении этим же запросом из предыдущего поста, там было 284.77 sec):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SQL> set stat on; select * from (select count(distinct x)over() c from ts) rows 1;

                    C
=====================
                65535

Current memory = 144910592
Delta memory = 502968
Max memory = 2309274928
Elapsed time= 205.15 sec
Cpu = 0.00 sec
Buffers = 16384
Reads = 582815
Writes = 0
Fetches = 190924278
...
Рейтинг: 0 / 0
22.01.2014, 20:24:50
    #38534886
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
В общем, макс. скорость получилась при:
1) установке TempCacheLimit = 4096M (да, он "понимает" это; fb_rec_buf & fb_sort-файлов не создаётся)
2) переназначению TempDirectories на виртуальный диск tmpfs = /dev/shm емкостью 16Гб

При этом получилось:
Код: plaintext
1.
2.
3.
* при TempBlockSize =  10M  Elapsed time= 176.28 sec.
* при TempBlockSize = 100M  Elapsed time= 128.49 sec.
* при TempBlockSize = 200M  Elapsed time= 115.20 sec.

ЗЫ.
Так и не понял:
1) зачем вообще в запросе count(distinct x), что с over() что без, применять сортировку, которая жрёт 120 мегов. Можно ведь просто накапливать разные значения в некоторой структуре типа hashset и выдать затем число её элементов.
2) почему увеличение TempCacheLimit с 2 до 4 Гб приводит к такому уменьшению времени, если времянки всё равно создаются в оперативной памяти, на tmpfs емкостью 16 Гб.
...
Рейтинг: 0 / 0
22.01.2014, 20:50:20
    #38534904
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
Да, и вот еще (из серии "мотай на ус / хозяйке на заметку").
На этой таблице есть два индекса:
Код: plaintext
1.
2.
TS_X_ASC INDEX ON TS(X)
TS_X_DESC DESCENDING INDEX ON TS(X)

Решил сравнить count(distinct x)over() с эквивалентным ему dense_rank()over(order by x)+dense_rank()over(order by x desc)-1.
В логе скрипта, смотрящего на появление файлов в /dev/shm, появилось вот это:
Код: plaintext
1.
2.
3.
4.
5.
COMMAND    PID     USER   FD   TYPE DEVICE   SIZE/OFF NLINK    NODE NAME
firebird 31962 firebird    4u   REG   0,17 1207959552     0 1840289 /dev/shm/fb_sort_yG2vQa (deleted)
firebird 31962 firebird    5u   REG   0,17 2340421632     0 1840290 /dev/shm/fb_recbuf_15gPME (deleted)
firebird 31962 firebird    9u   REG   0,17 5377097728     0 1840291 /dev/shm/fb_sort_iJHugt (deleted)
firebird 31962 firebird   10u   REG   0,17 5402263552     0 1840292 /dev/shm/fb_recbuf_Um8ftJ (deleted)
т.е. в сумме 6.5 гб на fb_sort и 5.4 гб на буфер. Понятно, что никаких индексов он не юзал, но я это помню еще с лета, проверял тогда.
На вторую сортировку у него ушло 5.37 гб - при том, что общий размер базы = 5.9 гб, а в таблице 100 млн int-чисел... Многовато жрёт, КМК.

Затраты по времени, ес-сно, оказались хуже плинтуса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
                    C
=====================
                65535

Current memory = 144928000
Delta memory = 15336
Max memory = 4551284088
Elapsed time=  491.98 sec 
Cpu = 0.00 sec
Buffers = 16384
Reads = 582442
Writes = 0
Fetches = 190923738
...
Рейтинг: 0 / 0
22.01.2014, 22:37:52
    #38534976
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
ТаблоидМноговато жрёт, КМК
там вполне сознательный и необходимый оверхед, причем он фиксирован. Посортируй 10 интов или что еще подлиннее и увидишь это.
...
Рейтинг: 0 / 0
22.01.2014, 23:12:55
    #38535004
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
Таблоидзачем вообще в запросе count(distinct x), что с over() что без, применять сортировку, которая жрёт 120 мегов. Можно ведь просто накапливать разные значения в некоторой структуре типа hashset и выдать затем число её элементов.

агрегирование хэшированием в FB пока увы нет (хотя я не уверен что здесь тот случай).
...
Рейтинг: 0 / 0
22.01.2014, 23:54:32
    #38535028
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
Симонов Денис,

тут вопрос в селективности X. При низкой хеш-таблица или дерево могут быть хороши. А при высокой сортировка переиграет вас в разы.
...
Рейтинг: 0 / 0
23.01.2014, 00:00:59
    #38535030
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
dimitr,

ну так оптимизатор может ведь выбрать оптимальный вариант агрегирования, если соответствующие сведения доступны в статистике.
...
Рейтинг: 0 / 0
23.01.2014, 00:04:07
    #38535032
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
Симонов Денис,

вот когда будет из чего выбирать - тогда и разговор пойдет. И когда статистика будет не только по индексированным полям.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ? / 25 сообщений из 40, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]