Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как быстрей сделать выборку по диапазону дат  [new]
relief
Member

Откуда:
Сообщений: 1197
Привет.

СКЛ-2005.
Есть таблица продаж 30 млн.
В ней есть поле Дата продажи - DateTime

Есть процедура которая принимает 2 параметра: дата начала и дата окончания.
Но оба параметра необязательны, т.е. если какая то дата не пришла, то надо делать выборку до/от этой даты.

Как сделать эффективный запрос и есть ли смысл в некластерном ключе по полю ДатаПродажи?
17 фев 12, 14:45    [12110341]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрей сделать выборку по диапазону дат  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
https://www.sql.ru/faq/faq_topic.aspx?fid=114
17 фев 12, 14:51    [12110405]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрей сделать выборку по диапазону дат  [new]
Glory
Member

Откуда:
Сообщений: 104751
relief
Есть процедура которая принимает 2 параметра: дата начала и дата окончания.
Но оба параметра необязательны, т.е. если какая то дата не пришла, то надо делать выборку до/от этой даты.

Т.е. если не задать обе даты, то "отгрузить" клиенту все 30млн.записей ?
17 фев 12, 14:52    [12110416]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрей сделать выборку по диапазону дат  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
WHERE ДатаПродажи BETWEEN ISNULL(@FromDate,'1753') AND ISNULL(@ToDate,'99991231 23:59:59.997');
Индекс, конечно, сделать надо бы.
17 фев 12, 14:52    [12110420]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрей сделать выборку по диапазону дат  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
relief,

Если даты не заданы, то можно либо установить заведомо меньшую/бОльшую дату в самом параметре (при этом, учтите что оптимизатор не будет знать это значение), либо сравнивать как-нибудь так where date >= isnull(@datestart,'19000101').

Кстати, раз речь идет о процедуре, параметрах и "универсальности", то сразу подумайте про проблему прослушивания параметров. Может быть будет иметь смысл выполнять запрос с option(recompile) или сделать поведение более предсказуемым при помощи option(optimmize for), либо вообще разбить на разные ветки кода.
17 фев 12, 15:01    [12110492]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрей сделать выборку по диапазону дат  [new]
relief
Member

Откуда:
Сообщений: 1197
Glory
relief
Есть процедура которая принимает 2 параметра: дата начала и дата окончания.
Но оба параметра необязательны, т.е. если какая то дата не пришла, то надо делать выборку до/от этой даты.

Т.е. если не задать обе даты, то "отгрузить" клиенту все 30млн.записей ?


да.
не смогли придумать решение, если клиент хочет просмотреть все свои продажи.
Есть у вас идеи?
17 фев 12, 18:06    [12112215]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрей сделать выборку по диапазону дат  [new]
relief
Member

Откуда:
Сообщений: 1197
SomewhereSomehow
relief,

Если даты не заданы, то можно либо установить заведомо меньшую/бОльшую дату в самом параметре (при этом, учтите что оптимизатор не будет знать это значение), либо сравнивать как-нибудь так where date >= isnull(@datestart,'19000101').
.


я сделал как советовал iap


SomewhereSomehow
Кстати, раз речь идет о процедуре, параметрах и "универсальности", то сразу подумайте про проблему прослушивания параметров. Может быть будет иметь смысл выполнять запрос с option(recompile) или сделать поведение более предсказуемым при помощи option(optimmize for), либо вообще разбить на разные ветки кода.


а можно поподробней?
17 фев 12, 18:08    [12112226]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрей сделать выборку по диапазону дат  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
relief,

Вкратце, сервер умеет прослушивать значение параметров, во время первого выполнения процедуры. Если в этот момент параметры будут такие, что отберется небольшое кол-во записаей то сервер построит план с использованием Index Seek, и все вроде бы ок. Но прикол в том, что если в следующий раз, параметры буут такие, что нужно будет выбрать полтаблицы, по прежнему будет использоваться поиск, хотя выгоднее уже применить просмотр, т.е. скан. Ну и обратная ситуация.
вот тут подробнее.
И вообще, можете поискатьл по форуму, проблема много раз обсуждалась, просто хотелось заранее вас предупредить.
17 фев 12, 18:27    [12112365]     Ответить | Цитировать Сообщить модератору
 Re: Как быстрей сделать выборку по диапазону дат  [new]
relief
Member

Откуда:
Сообщений: 1197
SomewhereSomehow
relief,

Вкратце, сервер умеет прослушивать значение параметров, во время первого выполнения процедуры. Если в этот момент параметры будут такие, что отберется небольшое кол-во записаей то сервер построит план с использованием Index Seek, и все вроде бы ок. Но прикол в том, что если в следующий раз, параметры буут такие, что нужно будет выбрать полтаблицы, по прежнему будет использоваться поиск, хотя выгоднее уже применить просмотр, т.е. скан. Ну и обратная ситуация.
вот тут подробнее.
И вообще, можете поискатьл по форуму, проблема много раз обсуждалась, просто хотелось заранее вас предупредить.


большое спасибо вам!
17 фев 12, 23:04    [12113736]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить