Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Jovanny Member Откуда: Сообщений: 1196 |
Вчера возился с простым запросом.SELECT RecordDateTrim AS DateBegin, COUNT(*) AS RowNumber FROM OLTP.SkuByDayCategories GROUP BY RecordDateTrim OLTP.SkuByDayCategories - это индексированное представление. Решил побаловаться с хинтами. SELECT RecordDateTrim AS DateBegin, COUNT(*) AS RowNumber FROM OLTP.SkuByDayCategories WITH(NOEXPAND, INDEX([IX_SkuByDayCategories_RecordDateTrim]), FORCESCAN) GROUP BY RecordDateTrim И получил планы выполнения. Хотя первый запрос выполняет все условия, заданные хинтами, планы и стоимость отличаются. Стоимость оригинального запроса 1173, с хинтами - 751. Скорость выполнения отличается примерно в тех же пропорциях. Так что оптимизатор продолжает подносить сюрпризы. К сообщению приложен файл. Размер - 37Kb |
22 окт 14, 11:28 [16741928] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Indexed views can be created in any edition of SQL Server. In SQL Server Enterprise, the query optimizer automatically considers the indexed view. To use an indexed view in all other editions, the NOEXPAND table hint must be used. |
||
22 окт 14, 11:35 [16741970] Ответить | Цитировать Сообщить модератору |
SomewhereSomehow Member Откуда: Moscow Сообщений: 2480 Блог |
Jovanny, Похоже, при помощи хинтов вы сделали последовательный план таким дорогим по стоимости, что оптимизатор решил выбрать параллельный план (стоимость параллельного пропорционально уменьшилась). Вы поставьте в свой запрос с хинтами option(maxdop 1) и сравните скорость и стоимость. |
22 окт 14, 11:37 [16741988] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8704 |
Или в запрос без хинтов добавьте (только для эксперемента) OPTION (QUERYTRACEON 8649) |
||
22 окт 14, 12:29 [16742377] Ответить | Цитировать Сообщить модератору |
Jovanny Member Откуда: Сообщений: 1196 |
Не понял, что Вы хотите этим сказать?
|
||||||
22 окт 14, 12:34 [16742435] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Именно то, что вы сейчас и сделали. На разных редакциях некоторые хинты работают по разному. |
||
22 окт 14, 12:39 [16742479] Ответить | Цитировать Сообщить модератору |
Александр52 Member Откуда: Кокосовые острова ส็็็็็ Сообщений: 5134 |
Jovanny, хинтами нужно уметь пользоваться и понимать что прирост в скорости тут скажется отрицательно на других, параллельно выполняемых запросах. |
22 окт 14, 12:47 [16742556] Ответить | Цитировать Сообщить модератору |
Jovanny Member Откуда: Сообщений: 1196 |
Делал и такое. Планы одинаковы по операторам, но план с хинтами немного дешевле и выполняется немного быстрее. (1878 row(s) affected) Table 'SkuByDayCategories'. Scan count 12, logical reads 657583, physical reads 0, read-ahead reads 27, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. (1 row(s) affected) SQL Server Execution Times: CPU time = 96266 ms, elapsed time = 134913 ms. (1878 row(s) affected) Table 'SkuByDayCategories'. Scan count 12, logical reads 657583, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. (1 row(s) affected) SQL Server Execution Times: CPU time = 89984 ms, elapsed time = 103789 ms. К сообщению приложен файл. Размер - 47Kb |
||
22 окт 14, 13:07 [16742743] Ответить | Цитировать Сообщить модератору |
Jovanny Member Откуда: Сообщений: 1196 |
А тут тоже интересно. К сообщению приложен файл. Размер - 55Kb |
||||
22 окт 14, 13:16 [16742804] Ответить | Цитировать Сообщить модератору |
Jovanny Member Откуда: Сообщений: 1196 |
Принудительно параллелизованый план стоит 3122, план с хинтами 751. |
22 окт 14, 13:18 [16742814] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8704 |
у вас два индекса с начинающихся с RecordDatetrim? |
||||
22 окт 14, 13:18 [16742815] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8704 |
а статистика io/time? |
||
22 окт 14, 13:20 [16742822] Ответить | Цитировать Сообщить модератору |
Jovanny Member Откуда: Сообщений: 1196 |
|
||
22 окт 14, 13:28 [16742860] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8704 |
чем тогда различаются два непараллельных плана? |
||||
22 окт 14, 13:35 [16742897] Ответить | Цитировать Сообщить модератору |
Jovanny Member Откуда: Сообщений: 1196 |
|
||
22 окт 14, 13:47 [16742983] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8704 |
Кроме стоимости, конечно. set statistics profile on или реальный план выполнения запросов в формате .sqlplan покажИте. |
||
22 окт 14, 13:50 [16743008] Ответить | Цитировать Сообщить модератору |
Jovanny Member Откуда: Сообщений: 1196 |
16742743 |
22 окт 14, 13:57 [16743045] Ответить | Цитировать Сообщить модератору |
Jovanny Member Откуда: Сообщений: 1196 |
Это реальные планы и статистика. |
22 окт 14, 13:58 [16743048] Ответить | Цитировать Сообщить модератору |
SomewhereSomehow Member Откуда: Moscow Сообщений: 2480 Блог |
Ну вот, когда оба плана не параллельные, разница в стоимости меньше и уже обусловлена другими причинами. То, что она вообще есть, это недоработка оптимизатора, который упрощает разные деревья из-за хинта noexpand. А то что быстрее выполняется, вы посмотрите на свою же статистику:
Судя по этому, в первый раз данных нет в кэше, по этому выполняются физические чтения, во втором такого нет, отсюда разница в скорости. Попробуйте выполнить тест несколько раз подряд - разница должна быть на уровне погрешности. |
||||
22 окт 14, 14:02 [16743070] Ответить | Цитировать Сообщить модератору |
Jovanny Member Откуда: Сообщений: 1196 |
SomewhereSomehow, Это второе выполнение, в первом упреждающих чтений было намного больше. Но согласитесь, 27 упреждающих чтений против 657583 логических погоду не делают. |
22 окт 14, 14:07 [16743117] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8704 |
|
||
22 окт 14, 14:17 [16743187] Ответить | Цитировать Сообщить модератору |
Jovanny Member Откуда: Сообщений: 1196 |
msLex, Сейчас админы перегружают сервер, планы выставлю чуть позже. |
22 окт 14, 14:18 [16743200] Ответить | Цитировать Сообщить модератору |
SomewhereSomehow Member Откуда: Moscow Сообщений: 2480 Блог |
Jovanny, Согласиться не могу. Для чистоты эксперимента нужно либо очищать кэш перед каждым выполнением, либо добиться чтобы данные всегда были в кэше. А еще исключить влияние блокировок и время на передачу строк клиенту. Говоря про вторую картинку, с не параллельными планами, из формы планов (а по картинке только ее и можно понять) не вижу никаких предпосылок, почему бы различаться времени выполнения, при соблюдении оговоренных выше условий. Отсюда делаю вывод что какое-то из условий выше не соблюдено, например нет данных в кэше, что и показывает ваша статистика IO. |
22 окт 14, 14:21 [16743234] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8704 |
Меня смущает разная "толщина" результирующего набора. При этом автор утверждает, что это реальные а не предварительные планы. |
||
22 окт 14, 15:32 [16743820] Ответить | Цитировать Сообщить модератору |
SomewhereSomehow Member Откуда: Moscow Сообщений: 2480 Блог |
Такое может быть. Это последствия упрощения из разных деревьев, которые разные из-за подсказки noexpand. Выглядит нелогично, но в данном случае, "на точность стрельбы не влияет". |
||
22 окт 14, 15:45 [16743931] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |