Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Почем выборка с датой в явном виде на порядок быстрее той же выборки но с переменными? / 8 сообщений из 8, страница 1 из 1
29.01.2022, 17:58
    #40130521
JMLabs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почем выборка с датой в явном виде на порядок быстрее той же выборки но с переменными?
Здравствуйте!
Кто может прокомментировать такую странную ситуацию. Есть пухлая таблица со статистикой измерений некоторой величины, там фактически три столбца: ID (int), CreateDate (datetime2), Value (float). Для анализа я делаю выборку во временную таблицу двумя способами:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
-- способ 1
DECLARE @from DATETIME = '29.01.2022 00:00:00'
DECLARE @to DATETIME = '30.01.2022 23:59:59'
SELECT
  *
INTO #tab 
FROM dbo.Results WITH (NOLOCK)
WHERE CreateDate BETWEEN @from AND @to

-- способ 2
SELECT
  *
INTO #tab 
FROM dbo.Results WITH (NOLOCK)
WHERE CreateDate BETWEEN '29.01.2022 00:00:00' AND '30.01.2022 23:59:59'



Чудеса заключаются в том что способ 1 работает на порядок дольше способа 2. Почему так?
...
Рейтинг: 0 / 0
29.01.2022, 18:31
    #40130523
3unknown
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почем выборка с датой в явном виде на порядок быстрее той же выборки но с переменными?
Надо сравнивать планы исполнения в обоих случаях. Очевидно, с параметрами в условиях не используется индекс по полю CreateDate, а когда даты вставляются непосредствпнно, идет чтение индекса и все работает быстро.
Такое часто бывает, когда запускаешь код в SSMS.
...
Рейтинг: 0 / 0
29.01.2022, 19:01
    #40130526
milenium
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почем выборка с датой в явном виде на порядок быстрее той же выборки но с переменными?
JMLabs,
Компилируется каждый раз запрос с переменными.
Можно сделать STORED PROCEDURE с двумя параметрами и обращаться к ней.
...
Рейтинг: 0 / 0
30.01.2022, 01:37
    #40130553
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почем выборка с датой в явном виде на порядок быстрее той же выборки но с переменными?
JMLabs,

'29.01.2022 00:00:00' неправильно, кстати, надо '20220129 00:00:00'.

Быстрее потому, что разные планы выполнения запросов. Если используется переменная, то её значение неизвестно и оптимизатор не может использовать статистику и индекс, если такой имеется.
...
Рейтинг: 0 / 0
30.01.2022, 11:04
    #40130559
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почем выборка с датой в явном виде на порядок быстрее той же выборки но с переменными?
Владислав Колосов
JMLabs,

'29.01.2022 00:00:00' неправильно, кстати, надо '20220129 00:00:00'.

Быстрее потому, что разные планы выполнения запросов. Если используется переменная, то её значение неизвестно и оптимизатор не может использовать статистику и индекс, если такой имеется.


Индекс может.
Но индекс у страдальца по CreateDate, к бабке ходить не надо.
Не может оценить число строк выборки и решает, что сканирование дешевле лукапа кластерного.
...
Рейтинг: 0 / 0
31.01.2022, 16:34
    #40130791
JMLabs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почем выборка с датой в явном виде на порядок быстрее той же выборки но с переменными?
Спасибо всем откликнувшимся, но что посоветуете сделать? Действительно, работаю в студии но не в SSMS а в dbForge и хочу чтобы даты были переменными. Я не большой специалист в SQL, план исполнения, например, не знаю как посмотреть, но я вижу что создан индекс, но только по столбцу Value а не по CreateDate. Может быть в этом дело?
...
Рейтинг: 0 / 0
31.01.2022, 17:10
    #40130804
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почем выборка с датой в явном виде на порядок быстрее той же выборки но с переменными?
JMLabs,

попробуйте в конец параметризированного запроса следующие варианты:
1) OPTION (RECOMPILE)
2) OPTION (OPTIMIZE FOR (@from='29.01.2022 00:00:00', @to ='30.01.2022 23:59:59'));
...
Рейтинг: 0 / 0
31.01.2022, 17:37
    #40130811
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почем выборка с датой в явном виде на порядок быстрее той же выборки но с переменными?
JMLabs
Спасибо всем откликнувшимся, но что посоветуете сделать? Действительно, работаю в студии но не в SSMS а в dbForge и хочу чтобы даты были переменными. Я не большой специалист в SQL, план исполнения, например, не знаю как посмотреть, но я вижу что создан индекс, но только по столбцу Value а не по CreateDate. Может быть в этом дело?


Во первых, там ишо кластерный индекс должон БЫ быть.
А если его нет - надо создать кластерный индекс (CreateDate). И пребудет с тобой щастье...
Ежели же он уже есть и ДРУГОЙ - надоть подумать...

Особливо если все запросы сводятся к
FROM dbo.Results
WHERE CreateDate BETWEEN @from AND @to

ЗЫ. Ибо в ОТСУТСТВИИ кластерного индекса или индекса по CreateDate описываемый спецэффект необъясним.
Рази только у тя дата в 'СТРОКЕ' хранится...
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Почем выборка с датой в явном виде на порядок быстрее той же выборки но с переменными? / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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