Есть ли более быстрый способ переписать следующий запрос - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть несколько очень больших таблиц (от 70 до 90 миллионов строк), занимающих 40-60 ГБ памяти.Эти таблицы также широки (до 100 столбцов).Один из столбцов - это дата создания, которая также является столбцом ключа кластера.Существует также ограничение первичного ключа и индекс плюс индекс columnstore для всех столбцов.Диапазон дат - с 2015 года по настоящее время.Мне нужно получить первое и последнее свидание в течение каждого года.Выполнение следующего для любого года

select min(date_created),max(date_created),count(*) from my_table where datepart (year from date_created) = <4 digit year>;

дало результат в течение 3 секунд. Итак, следующий запрос:

`with years as (
select datepart (year from date_created) as yearz, count(*) as cnt
from my_table group by datepart (year from date_created)
          )
select 
years.yearz, min(date_created), max(date_created), years.cnt
from my_table a
inner join years on datepart(year from a.date_created) = years.yearz
group by years.yearz, years.cnt
order by years.yearz asc`

дал результаты, которые мне нужны в течение 4 секунд!

Есть ли лучший способ переписать указанный выше запрос с использованием аналитики / и т. Д., А также быстрее получать результаты.

Спасибо.

Я пытался
select datepart (year from date_created) as year, first_value(date_created) over (partition by datepart (year from date_created) order by date_created ROWS UNBOUNDED PRECEDING) as first_date, last_value(date_created) over (partition by datepart (year from date_created) order by date_created ROWS UNBOUNDED PRECEDING) as last_date from my_table

Это продолжалось более 5 минут и в итоге было убито.План показал выполнение в режиме строки по индексу columnstore.

...