Атрибуты, примененные к столбцу "i" в таблице в q kdb - Производительность - PullRequest
1 голос
/ 21 мая 2019

Когда я запускаю запрос ниже, чтобы получить количество таблиц, размер и время, затраченное на выполнение запроса, практически одинаковы./ таблица t имеет 97029 записей и 124 столбца

Q.1.- Использует ли столбец i в приведенном ниже запросе уникальный атрибут для внутреннего возврата результата в постоянное время, используя функцию has?

\ts select last i from t where date=.z.d-5 / 3j, 1313248j 
/ time taken to run the query and memory used is always same not matter how many times we run same query

Когда я запускаю запрос ниже:
В первый раз требуются время и память оченьвысокий, но со следующего запуска время и память, требуемые очень меньше.

Q.2.Кэширует ли kdb вывод при первом запуске запроса и показывает вывод из кеша со следующего раза?

В.3. Применился ли атрибут к столбцу i при выполнении под запросом, если да, то какой?

\ts select count i from t where date=.z.d-5 / 1512j, 67292448j
\ts select count i from t where date=.z.d-5 / 0j, 2160j

При выполнении под запросом:
Q.4 Есть лиатрибут применяется к столбцу i при выполнении запроса ниже?

\ts count select from t where date=.z.d-5 / 184j, 37292448j 
 /time taken to run the query and memory used is always same not matter how many times we run 

Q.5, какой из следующих запросов следует использовать для получения столбца таблиц с очень большим количеством записей?Любой другой запрос, который может быть более быстрым и требует меньше памяти для получения того же результата?

1 Ответ

5 голосов
/ 21 мая 2019
  1. Нет атрибута u#, примененного к столбцу i, чтобы увидеть это:
q)n:100000
q)t:([]a:`u#til n)
q)
q)\t:1000 select count distinct a from t
2
q)\t:1000 select count distinct i from t
536

Время этих запросов не является постоянным, естьпросто недостаточно значимых цифр, чтобы увидеть изменчивость.Использование

\ts:100 select last i from t where date=.z.d-5

выполнит запрос 100 раз и выделит, что время не является постоянным.

Первый запрос потребует выделить больше памяти для процесса q, который останется выделенным для процесса, если не будет вызвана сборка мусора (.Q.gc[]).Статистика использования памяти может быть просмотрена с помощью .Q.w[].Например, в новом сеансе:
q).Q.w[]
used| 542704
heap| 67108864
peak| 67108864
wmax| 0
mmap| 0
mphy| 16827965440
syms| 1044
symw| 48993
q)
q)\t b: til 500000000
6569
q)
q).Q.w[]
used| 4295510048
heap| 4362076160
peak| 4362076160
wmax| 0
mmap| 0
mphy| 16827965440
syms| 1044
symw| 48993
q)
q)b:0
q)
q).Q.w[]
used| 542768
heap| 4362076160
peak| 4362076160
wmax| 0
mmap| 0
mphy| 16827965440
syms| 1044
symw| 48993
q)
q)\t b: til 500000000
877
q)
q).Q.w[]
used| 4295510048
heap| 4362076160
peak| 4362076160
wmax| 0
mmap| 0
mphy| 16827965440
syms| 1044
symw| 48993

Кроме того, предполагая, что рассматриваемая таблица разбита на разделы, показанный запрос будет заполнен .Q.pn, который затем может быть использован для получения счетчика впоследствии, дляпример

q).Q.pn
quotes|
trades|
q)\ts select count i from quotes where date=2014.04.25
0 2656
q).Q.pn
quotes| 85204 100761 81724 88753 115685 125120 121458 97826 99577 82763
trades| ()

Более подробно .Q.ps выполняет некоторые из операций select под капотом.если вы посмотрите на 3-ю строку:

if[$[#c;0;(g:(. a)~,pf)|(. a)~,(#:;`i)];f:!a;j:dt[d]t;...

, это проверяет "a" (select) часть запроса, и если это

(#:;`i)

(что является count i) в итоге запускается .Q.dt, который запускает .Q.cn, который получает количество разделов.Поэтому, когда он запускается в первый раз, он запускает .Q.cn, получая счетчик для всех разделов.В следующий раз, когда будет запущен .Q.cn, он может просто посмотреть значения в словаре .Q.pn, что намного быстрее.

См. Выше.

См. Выше об атрибутах i.count - это отдельная операция, не являющаяся частью запроса и не подверженная влиянию атрибутов столбцов, она будет видеть таблицу в виде списка.

Для таблиц на диске каждаястолбец должен содержать заголовок, в котором счетчик векторов доступен с очень небольшими затратами:

q)`:q set til 123
`:q
q)read1 `:q
0xfe200700000000007b000000000000000000000000000000010000000000000002000000000..
q)9#read1 `:q
0xfe200700000000007b
q)`int$last 9#read1 `:q
123i
q)
q)`:q set til 124
`:q
q)9#read1 `:q
0xfe200700000000007c
q)`int$last 9#read1 `:q
124i

Тем не менее, чтение любого файла обычно занимает минимум 1 мс, поэтому счетчик кэшируетсякак упомянуто выше.

...