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

Откуда:
Сообщений: 13
Есть запрос:
select * from datT1 left join datT2 on
datT2.Field_NRec = datT1.cField
WHERE YEAR(datT1.[Дата]) = 2013 AND MONTH(datT1.[Дата]) = 1

за 2012 год работает 49 сек,
за 2013 год работает часы,
есть поставить условие WHERE (YEAR(datT1.[Дата]) = 2012 OR YEAR(datT1.[Дата]) = 2013) AND MONTH(datT1.[Дата]) = 1, то работает 80 сек.

Если убрать left join, то запрос отрабатывает в любой интервал времени быстро.
Помогите разобраться, что нужно сделать, чтобы запрос работал за 2013 год быстро.
4 фев 13, 17:43    [13874021]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
aleks2
Guest
WHERE '20130101'<=datT1.[Дата] AND datT1.[Дата] < '20130201'
4 фев 13, 17:47    [13874059]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
SQLBIAndI
Member

Откуда:
Сообщений: 13
aleks2, к сожалению не помогает
4 фев 13, 17:53    [13874103]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
Remind
Member

Откуда: UK
Сообщений: 523
Индекс по дате есть?
4 фев 13, 17:54    [13874106]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
SQLBIAndI
Member

Откуда:
Сообщений: 13
Remind,
раньше индекса не было, работало всегда быстро.
В базу загрузились данные за 2010-2011 год и дополнялись с конца 2011 года. С 2013 начались проблемы быстродействия.
Пробовала добавить:
CREATE NONCLUSTERED INDEX [IX_Дата] ON [dbo].[datT1]
(
[Дата] ASC
)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

На скорость этого запроса индекс не повлиял.
4 фев 13, 18:01    [13874143]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
Добрый Э - Эх
Guest
SQLBIAndI,

а по плану видно, что при выполнении запроса вновь созданный индекс подхватился ?
4 фев 13, 18:02    [13874155]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
Гость333
Member

Откуда:
Сообщений: 3683
SQLBIAndI
Помогите разобраться, что нужно сделать, чтобы запрос работал за 2013 год быстро.

Сначала нужно сравнить планы запросов и понять, чем они отличаются.
4 фев 13, 18:03    [13874158]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
SQLBIAndI
Member

Откуда:
Сообщений: 13
Гость333, ничем
4 фев 13, 18:04    [13874165]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
Добрый Э - Эх
Guest
SQLBIAndI
Гость333, ничем
стало быть - индекс идет боком и в запросе не используется.
4 фев 13, 18:05    [13874172]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
Гость333
Member

Откуда:
Сообщений: 3683
SQLBIAndI
Гость333, ничем

Я пытался намекнуть, чтобы вы показали тут планы запросов. Теперь говорю прямым текстом: покажите планы :)
4 фев 13, 18:11    [13874199]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
SQLBIAndI
Member

Откуда:
Сообщений: 13
Гость333,

это без индекса 2013

К сообщению приложен файл (2013.sqlplan - 133Kb) cкачать
4 фев 13, 18:35    [13874257]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
SQLBIAndI
Member

Откуда:
Сообщений: 13
Гость333, это без индекса 2012

К сообщению приложен файл (2012.sqlplan - 139Kb) cкачать
4 фев 13, 18:36    [13874260]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
SQLBIAndI
Member

Откуда:
Сообщений: 13
Гость333, это с индексом. Я, видимо в прошлый раз неправильно создала индекс, поскольку в этот раз индекс ускорил работу, но все равно 2013 год работает медленнее 2012, правда уже не в разы (12 сек 2012 год (140 тыс. данных) против 98 сек 2013 год (160 тыс.)).

К сообщению приложен файл (index.rar - 12Kb) cкачать
4 фев 13, 18:49    [13874291]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
Гость333
Member

Откуда:
Сообщений: 3683
SQLBIAndI,

А говорите, планы выполнения не отличаются. Без индексов для 2012 года у вас был hash join, а для 2013 года — совершенно корявый loop join.

Если коротко, то допишите к вашему запросу option(hash join). Должно полегчать.
4 фев 13, 19:02    [13874322]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
Гость333
Member

Откуда:
Сообщений: 3683
SQLBIAndI
все равно 2013 год работает медленнее 2012, правда уже не в разы (12 сек 2012 год (140 тыс. данных) против 98 сек 2013 год (160 тыс.)).

В плане запроса 2013.sqlplan у вас возвращается 32 строки. У вас там стоит условие "year = 2013 and month = 3". А в плане запроса 2013_index.sqlplan это условие чудесным образом меняется на "year = 2013 and month = 1". Подставьте в запрос с индексом month = 3, наверняка также будет тормозить без option(hash join).
4 фев 13, 19:07    [13874337]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
SQLBIAndI
Member

Откуда:
Сообщений: 13
Гость333, а что значит option(hash join)?
4 фев 13, 19:29    [13874383]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
SQLBIAndI
Member

Откуда:
Сообщений: 13
Гость333, без индекса за третий месяц, потому что за первый не дождаться.
4 фев 13, 19:34    [13874398]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
Добрый Э - Эх
Guest
SQLBIAndI
Гость333, а что значит option(hash join)?
хинт (подсказка) оптимизатору, что для соединения таблиц использовать метод HASH JOIN, а не Nested Loops или Merge Join

З.Ы.
И даже не спрашивай, что такое методы соединения nested loop, merge join, hash join. На ночь глядя такое рассказывать не буду ;)
4 фев 13, 19:41    [13874414]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
SQLBIAndI,

Судя по планам в RAR-архиве, у вас устарела статистика. Для 2012 ожидаемое количество строк близко к фактическому (177195 против 161858, соответственно), а вот для 2013 разница составляет 12 раз - 13609 при факте 161858. Давно
sp_updatestats
вызывали?
4 фев 13, 21:10    [13874650]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
SQLBIAndI,

И никаких хинтов, пока не убедитесь, что статистика обновлена, а индексы дефрагментированы и, главное, те что надо.
4 фев 13, 21:12    [13874658]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
1. Индекс по дате, он видимо уже есть
2. Использовать не функции, а прямое указание диапазона, как указали выше
WHERE '20130101'<=datT1.[Дата] AND datT1.[Дата] < '20130201'

3. Возможно стоит добавить индекс по datT2.Field_NRec
4 фев 13, 22:23    [13874835]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
SQLBIAndI
Member

Откуда:
Сообщений: 13
Ennor Tiegael,

Спасибо, завтра попробую, я и предполагала, что со статистикой может быть связано, поскольку старая, но не хватало опыта . По результатам сообщу помогло или нет.
4 фев 13, 22:26    [13874843]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
SQLBIAndI
Member

Откуда:
Сообщений: 13
Ennor Tiegael,
не дождалась завтра. Проверила сегодня.
ПОМОГЛО!!! Спасибо большое.
Скажите, пожалуйста, а почему статистика не обновляется автоматически (у базы стоит свойство Auto Update Statistics = true)?
И как лучше сделать ее обновление: каждый день выполняется пакет IIS, который загружает данные в базу, обрабатывает их и на основании этих данных считается куб в Analysis? Как вариант, добавить в пакет IIS обновление статистики или лучше периодически вручную?
4 фев 13, 23:14    [13874992]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
SQLBIAndI,

В пакет добавьте, если много времени не требует обновление.
В ручную забудете.
4 фев 13, 23:33    [13875028]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с запросом  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
SQLBIAndI,

До 2012 версии у сиквела крайне тупой и неэффективный алгоритм автообновления: он включается, если изменено или добавлено хотя бы 20% таблицы. На больших - действительно больших - таблицах этого можно никогда не дождаться. В 2012 начали учитывать размер, но все равно лучше руками.

Если у вас данные грузятся балком, то делать обновление на всех таблицах, участвовавших в загрузке, сразу после окончания оной. Ну и дополнительно к этому имеет смысл сделать джоб, который раз в сутки будет обновлять статистику на всей БД. Тут смотрите сами насчет периодичности, вам виднее.
5 фев 13, 03:43    [13875383]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить