powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
25 сообщений из 40, страница 1 из 2
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
    #38533649
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
    #38533736
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм.
У меня под 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
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
    #38533738
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидСтатистику манипуляций с окном - её можно где-то увидеть ?
нет, нельзя
...
Рейтинг: 0 / 0
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
    #38533769
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисУ меня под Windows вот этой строчки в статистике нетДык переходи быстрее на линух, тут гораздо больше инфы выдается! :-)
...
Рейтинг: 0 / 0
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
    #38533772
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrТаблоидСтатистику манипуляций с окном - её можно где-то увидеть ?нет, нельзяЛадно. Но почему такое различие во времени ? Окно не влезло в память (TempCacheLimit ?) и он его засвопил, или причина в другом ?
...
Рейтинг: 0 / 0
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
    #38533805
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисУ меня под Windows вот этой строчки в статистике нет

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

раз так то не особо
...
Рейтинг: 0 / 0
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
    #38533904
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидНо почему такое различие во времени ? Окно не влезло в память (TempCacheLimit ?) и он его засвопил, или причина в другом ?
а как 800МБ могло влезть в TempCacheLimit? :-)
...
Рейтинг: 0 / 0
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
    #38534163
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
    #38534184
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А нельзя ли в статистике добавить насколько заполнен этот TempCache? Тогда было бы понятно попадают ли сортировки, хэш таблицы или материализованные таблицы в ОП или идут на диск.
...
Рейтинг: 0 / 0
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
    #38534220
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для tempCacheLimit = 768M результат тот же, что для 1024М.
Для 384М - около 380 сек.

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

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

Таблоид,

а если TempBlockSize увеличить раз в 10?
...
Рейтинг: 0 / 0
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
    #38534448
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
    #38534460
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидНо и не уменьшилось, застряло на одном значении
значит, так дорого обходится постоянное копирование записей в/из temp space
...
Рейтинг: 0 / 0
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
    #38534465
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и конечно же не надо сравнивать с count(*), сам знаешь почему. count(x) будет честнее.
...
Рейтинг: 0 / 0
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
    #38534526
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
    #38534635
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я понял. ему надо более 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
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
    #38534648
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поставил 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
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
    #38534886
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, макс. скорость получилась при:
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
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
    #38534904
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, и вот еще (из серии "мотай на ус / хозяйке на заметку").
На этой таблице есть два индекса:
Код: 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
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
    #38534976
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидМноговато жрёт, КМК
там вполне сознательный и необходимый оверхед, причем он фиксирован. Посортируй 10 интов или что еще подлиннее и увидишь это.
...
Рейтинг: 0 / 0
Статистика затрат на манипуляции с окнами OVER()-функций: как её увидеть ?
    #38535004
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидзачем вообще в запросе count(distinct x), что с over() что без, применять сортировку, которая жрёт 120 мегов. Можно ведь просто накапливать разные значения в некоторой структуре типа hashset и выдать затем число её элементов.

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

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

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

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


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