Сравнение производительности для методов запроса диапазона дат - PullRequest
2 голосов
/ 17 февраля 2012

Из двух запросов ниже, какой из них быстрее? Таблица содержит более 100 миллионов записей. Поэтому я просто хочу знать, совпадает ли использование ISNULL в предложении where с первым присвоением значения переменной и только с использованием переменной в предложении where?

declare @dt datetime
select COUNT(*) from pandl 
  where PaymentDate >= ISNULL(@dt, convert(nvarchar(10),getdate(), 121))

select @dt = ISNULL(@dt, convert(nvarchar(10),getdate(), 121))
select COUNT(*) from pandl 
  where PaymentDate >= @dt

Ответы [ 3 ]

2 голосов
/ 17 февраля 2012

Я бы предложил немного другой подход, избегая немного более дорогого преобразования в строку и используя немного меньший тип данных для хранения даты (так как вам не требуется субминутная детализация, если вы заботитесь только о границах дня):

DECLARE @dt SMALLDATETIME;
SET @dt = DATEADD(DAY, DATEDIFF(DAY, '19000101', CURRENT_TIMESTAMP), '19000101'); --*

SELECT COUNT(*) FROM dbo.pandl 
  WHERE PaymentDate >= @dt;

Если вы собираетесь продолжать использовать преобразование в строку, используйте CHAR(10) - я не думаю, что стиль 121 будет производить какие-либо форматы дат, требующие поддержки Unicode.

* да, вы можете сделать это без внешнего DATEADD , но не с новыми типами, такими как DATE

2 голосов
/ 17 февраля 2012

Второй будет лучше. Вызов функций из предложения where заставит оптимизатор запросов использовать сканирование вместо поиска. Другими словами, вы получите не идеальный план выполнения

1 голос
/ 17 февраля 2012

FWIW, если у вас нет индекса, это не повлияет на план:

http://data.stackexchange.com/stackoverflow/query/61684/http-stackoverflow-com-questions-9329461-ms-sql-query-performance

Запустите в текстовом режиме, проверьте показ плана выполнения.

Я полагал, что у одного из этих столбцов даты в StackExchange будет индекс, но я его не нашел.

Кроме этого, я с другими ответами на этот вопрос - не используйтеnvarchar излишне, не конвертируйте даты в строки без уважительной причины, не используйте функции, которые могут быть оценены более легко вне запроса внутри запроса (и вообще не используйте функции в запросе, если вам не нужнок).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...