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

Откуда:
Сообщений: 380
Добрый вечер!

SQL 2008 r2. Есть большая секционированная по кварталам (поле DDATE) таблица fcStock без индексов

Если написать запрос удаляющий последние 10 дней например

delete from fcStock where ddate>'20171002' , то всё обрабатывается за секунды и идет обращение к нужной секции

Если же предварительно объявить переменную:

DECLARE @DT DATETIME
SET @DT = CONVERT(VARCHAR(8), GETDATE() -10, 112)

delete from fcStock where ddate>@DT , то обработка идет несколько минут и идет сканирование всей таблицы.

В чём здесь может быть подвох ?
12 окт 17, 17:58    [20865289]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и переменная в запросе  [new]
Добрый Э - Эх
Guest
mishgan1,

подвох в том, что при использовании переменной оптимизатор ни сном ни духом не знает, какое количество данных попадет под условие, ибо на момент компиляции запроса значение переменной неизвестно и сервер строит план "на все случаи жизни", рассчитывая при этом на "наихудший" вариант - "в обработку попадают все записи".
при указании же константы - оптимизатор вполне себе понимает, что нужные ему данные - в одной секции и для получения правильного ответа ему совершенно необязательно сканировать всю таблицу, можно ограничится сканом одной секции.

З.Ы.
про "подглядывания" переменных говорить не буду, ибо не помню с какой версии они появились.
12 окт 17, 18:04    [20865305]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и переменная в запросе  [new]
mishgan1
Member

Откуда:
Сообщений: 380
Добрый Э - Эх,

А как забороть? Изучить подглядование?))
12 окт 17, 18:13    [20865328]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и переменная в запросе  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36972
option ( recompile ) еще можно изучить
12 окт 17, 18:18    [20865342]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и переменная в запросе  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1367
mishgan1,

DECLARE @DT DATETIME
SET @DT = CONVERT(VARCHAR(8), GETDATE() -10, 112)

delete from fcStock where ddate>@DT option(recompile)


или option(optimize for unknown) - в случае если перекомпиляция инструкции будет накладывать издержки по производительности.
12 окт 17, 18:19    [20865344]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и переменная в запросе  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
mishgan1
А как забороть?
delete from fcStock where ddate>@DT option(recompile)
12 окт 17, 18:25    [20865352]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и переменная в запросе  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7762
Полное сканирование происходит, если не совпадают типы аргумента функции секционирования и переменной. Проверьте на всякий случай.
12 окт 17, 18:54    [20865408]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и переменная в запросе  [new]
mishgan1
Member

Откуда:
Сообщений: 380
Владислав Колосов,

Да, это замечание отчасти решил проблему. Всем спасибо!
12 окт 17, 22:39    [20865848]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить