powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Почем выборка с датой в явном виде на порядок быстрее той же выборки но с переменными?
8 сообщений из 8, страница 1 из 1
Почем выборка с датой в явном виде на порядок быстрее той же выборки но с переменными?
    #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
Почем выборка с датой в явном виде на порядок быстрее той же выборки но с переменными?
    #40130523
3unknown
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Надо сравнивать планы исполнения в обоих случаях. Очевидно, с параметрами в условиях не используется индекс по полю CreateDate, а когда даты вставляются непосредствпнно, идет чтение индекса и все работает быстро.
Такое часто бывает, когда запускаешь код в SSMS.
...
Рейтинг: 0 / 0
Почем выборка с датой в явном виде на порядок быстрее той же выборки но с переменными?
    #40130526
milenium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JMLabs,
Компилируется каждый раз запрос с переменными.
Можно сделать STORED PROCEDURE с двумя параметрами и обращаться к ней.
...
Рейтинг: 0 / 0
Почем выборка с датой в явном виде на порядок быстрее той же выборки но с переменными?
    #40130553
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JMLabs,

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

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

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

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


Индекс может.
Но индекс у страдальца по CreateDate, к бабке ходить не надо.
Не может оценить число строк выборки и решает, что сканирование дешевле лукапа кластерного.
...
Рейтинг: 0 / 0
Почем выборка с датой в явном виде на порядок быстрее той же выборки но с переменными?
    #40130791
JMLabs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем откликнувшимся, но что посоветуете сделать? Действительно, работаю в студии но не в SSMS а в dbForge и хочу чтобы даты были переменными. Я не большой специалист в SQL, план исполнения, например, не знаю как посмотреть, но я вижу что создан индекс, но только по столбцу Value а не по CreateDate. Может быть в этом дело?
...
Рейтинг: 0 / 0
Почем выборка с датой в явном виде на порядок быстрее той же выборки но с переменными?
    #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
Почем выборка с датой в явном виде на порядок быстрее той же выборки но с переменными?
    #40130811
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JMLabs
Спасибо всем откликнувшимся, но что посоветуете сделать? Действительно, работаю в студии но не в SSMS а в dbForge и хочу чтобы даты были переменными. Я не большой специалист в SQL, план исполнения, например, не знаю как посмотреть, но я вижу что создан индекс, но только по столбцу Value а не по CreateDate. Может быть в этом дело?


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

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

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


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