Почему этот арифметический расчет быстрее, чем приведение nvarchar? - PullRequest
0 голосов
/ 05 сентября 2018

Следующий запрос выполняется быстрее (1:05):

SELECT DATEPART(DW,DATEFROMPARTS(
 FLOOR(20180501/10000)
,FLOOR(20180501-FLOOR(20180501/10000)*10000)/100
,FLOOR(20180501-FLOOR(20180501/100)*100)))
GO 1000

Чем (1:10):

SELECT DATEPART(DW,CAST(CAST(20180501 AS nvarchar) AS DATE))
GO 1000

Почему?

У меня естьтаблица с 2 миллиардами записей (примерно), поэтому разница становится важной.За жестко закодированной датой скрывается гораздо больше логики.В противном случае, если существует лучший подход, с точки зрения производительности, для выполнения той же логики, не стесняйтесь исправлять меня.

Столбец даты всегда целочисленный и не всегда имеет одинаковый формат.Извлекаются два формата: ГГГГММДД и ГГГГММ.Я знаю, немного беспорядка.

Спасибо!

1 Ответ

0 голосов
/ 05 сентября 2018

Удалить повторяющиеся строки, когда первый день месяца (ГГГГММ01) - понедельник

Если вы хотите ускорить удаление, создайте временную таблицу ( или постоянную, если этоявляется повторяющейся операцией ) со столбцом того же типа данных, что и столбец «дата» в вашей таблице со всеми 1-м понедельником каждого месяца в течение XX лет.Убедитесь, что данные в том же формате, который вы указали в своем вопросе.Убедитесь, что этот столбец имеет индекс (кластеризованный).Теперь используйте эту таблицу в своем запросе в качестве фильтра без каких-либо преобразований, которые позволят Sql Server использовать все индексы, существующие в столбце «дата» существующей таблицы.

...