Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 на что обращать внимание при чтении плана выполнения запроса  [new]
НОВИЧОК_2
Guest
ДОБРЫЙ ДЕНЬ ВСЕМ, НАЧАЛ ИЗУЧАТЬ ДЕЙСТВИТЕЛЬНЫЙ ПЛАН ВЫПОЛНЕНИЯ ЗАПРОСА
В файле приложен скрин 2 планов
верхний запрос делался через cross apply
нижний через обычный вложенный подзапрос
Ну вот на какие параметры обращать внимание, какие цифры показывают, что один из них оптимальнее. Цифры по стоимости в % чтоли?

К сообщению приложен файл. Размер - 114Kb


Сообщение было отредактировано: 31 окт 12, 12:55
31 окт 12, 09:57    [13400620]     Ответить | Цитировать Сообщить модератору
 Re: НА ЧТО ОБРАЩАТЬ ВНИМАНИЕ ПРИ ЧТЕНИИ ПЛАНА ВЫПОЛНЕНИЯ ЗАПРОСА  [new]
chatm
Member

Откуда: Москва
Сообщений: 480
НОВИЧОК_2,

На связку параметр+стоимость.

Clustered index scan + 52% как бы намекают..
31 окт 12, 10:00    [13400630]     Ответить | Цитировать Сообщить модератору
 Re: НА ЧТО ОБРАЩАТЬ ВНИМАНИЕ ПРИ ЧТЕНИИ ПЛАНА ВЫПОЛНЕНИЯ ЗАПРОСА  [new]
aleks2
Guest
chatm
НОВИЧОК_2,

На связку параметр+стоимость.

Clustered index scan + 52% как бы намекают..

1. На чо намекают?
2. Не надо изучать планы - надо писать правильно.
31 окт 12, 10:02    [13400648]     Ответить | Цитировать Сообщить модератору
 Re: НА ЧТО ОБРАЩАТЬ ВНИМАНИЕ ПРИ ЧТЕНИИ ПЛАНА ВЫПОЛНЕНИЯ ЗАПРОСА  [new]
Ozerov
Member

Откуда: Москва
Сообщений: 3637
aleks2
chatm
НОВИЧОК_2,

На связку параметр+стоимость.

Clustered index scan + 52% как бы намекают..

1. На чо намекают?
2. Не надо изучать планы - надо писать правильно.


2- Частенько бывает, что приходится изучать планы, когда ты ничего не писал :)
31 окт 12, 10:07    [13400666]     Ответить | Цитировать Сообщить модератору
 Re: НА ЧТО ОБРАЩАТЬ ВНИМАНИЕ ПРИ ЧТЕНИИ ПЛАНА ВЫПОЛНЕНИЯ ЗАПРОСА  [new]
chatm
Member

Откуда: Москва
Сообщений: 480
aleks2,

1. намекают на затраты (переводчик дебил - cost в данном контексте однозначно затрата, никак не стоимость). И что идет сканирование а не поиск, тоже повод для раздумий.

2. а зачем тогда нужны планы?
31 окт 12, 10:12    [13400683]     Ответить | Цитировать Сообщить модератору
 Re: НА ЧТО ОБРАЩАТЬ ВНИМАНИЕ ПРИ ЧТЕНИИ ПЛАНА ВЫПОЛНЕНИЯ ЗАПРОСА  [new]
НОВИЧОК_2
Guest
Clustered index scan 52% что обозначает? 52 % от всей продолжительности занял процесс сканирования класт индекса?
Но во 2 плане стоит key lookup 87%. А это с чем едят?
31 окт 12, 10:15    [13400693]     Ответить | Цитировать Сообщить модератору
 Re: НА ЧТО ОБРАЩАТЬ ВНИМАНИЕ ПРИ ЧТЕНИИ ПЛАНА ВЫПОЛНЕНИЯ ЗАПРОСА  [new]
chatm
Member

Откуда: Москва
Сообщений: 480
НОВИЧОК_2,

рекомендую почитать краткую но полезную статью understanding-query-plans
31 окт 12, 10:16    [13400695]     Ответить | Цитировать Сообщить модератору
 Re: НА ЧТО ОБРАЩАТЬ ВНИМАНИЕ ПРИ ЧТЕНИИ ПЛАНА ВЫПОЛНЕНИЯ ЗАПРОСА  [new]
aleks2
Guest
chatm
1. намекают на затраты


НОВИЧОК_2
Clustered index scan 52% что обозначает? 52 % от всей продолжительности занял процесс сканирования класт индекса?
Но во 2 плане стоит key lookup 87%. А это с чем едят?


Новичок, а не дурак.
31 окт 12, 10:24    [13400724]     Ответить | Цитировать Сообщить модератору
 Re: НА ЧТО ОБРАЩАТЬ ВНИМАНИЕ ПРИ ЧТЕНИИ ПЛАНА ВЫПОЛНЕНИЯ ЗАПРОСА  [new]
Glory
Member

Откуда:
Сообщений: 104751
chatm
И что идет сканирование а не поиск, тоже повод для раздумий.

А при Nested loops всегда будет сканирование

chatm
намекают на затраты

Быстрый план априори дороже медленного. Вопрос только в том, что ресурсов он тоже больше потребует. А они не резиновые.
31 окт 12, 10:24    [13400727]     Ответить | Цитировать Сообщить модератору
 Re: НА ЧТО ОБРАЩАТЬ ВНИМАНИЕ ПРИ ЧТЕНИИ ПЛАНА ВЫПОЛНЕНИЯ ЗАПРОСА  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
НОВИЧОК_2,

По планам запроса можно понять что сервер делает. Если вы знаете что сервер должен был сделать, то, сравнивая свое знание с тем что происходит, вы можете понять хорошо это или плохо. Если вы не знаете, какая наилучшая стратегия выполнения вашего запроса, то чем вам поможет сравнение двух разных наборов шагов (планов)? Вы же не знаете как должно быть, по этому трудно определить, что лучше.
Однако, на практике не всегда возможно (или хочется) охватить весь план мысленно, особенно в случае больших запросов. По этому, прибегают к косвенным признакам того, что план не самый оптимальный. Наиболее характерные признаки это, например, сильно различающееся число оценочных и реальных строк, или большой объем передаваемых данных от оператора к оператору (толстые стрелки в плане) и т.д. По ним определяете проблемное место и смотрите, что с этим можно сделать.
А на проценты не смотрите, они ко времени не имеют отношения.
31 окт 12, 12:51    [13401748]     Ответить | Цитировать Сообщить модератору
 Re: на что обращать внимание при чтении плана выполнения запроса  [new]
НОВИЧОК_2
Guest
Оба запроса возвращают идентичные данные. То что я хочу я получил. Теперь я хочу понять какой запрос использовать и какой не загнется если реальных данных будут намного больше. Я понимаю что в теории все мы должны знать что хотим и чего и как. Вернемся к практике. Какой из этих планов наиболее оптимален и САМОЕ ГЛАВНОЕ ПОЧЕМУ
Из того что я понял:
в первом случае 52% идет на сканирование кластерного индекса - это плохо и дорого
во втором случае key lookup - 87% -это дешевле чем скнаирование класт индекса
Статистика показала что второй враиант быстрее
Прошу на конкретном примере высказать ваши мысли вслух.
31 окт 12, 13:18    [13401899]     Ответить | Цитировать Сообщить модератору
 Re: на что обращать внимание при чтении плана выполнения запроса  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Включите в индекс IX_ACCOUNTS поля, которые лукапаются, и еще быстрее будет.
31 окт 12, 13:19    [13401904]     Ответить | Цитировать Сообщить модератору
 Re: на что обращать внимание при чтении плана выполнения запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
НОВИЧОК_2
Какой из этих планов наиболее оптимален

Огласите ваши критерии оптимальности

НОВИЧОК_2
Из того что я понял:
в первом случае 52% идет на сканирование кластерного индекса - это плохо и дорого
во втором случае key lookup - 87% -это дешевле чем скнаирование класт индекса

Ничего вы не поняли. Во втором плане тоже есть сканирование.
Потому что Nested loops _всегда_ что-то сканирует.
31 окт 12, 13:21    [13401932]     Ответить | Цитировать Сообщить модератору
 Re: на что обращать внимание при чтении плана выполнения запроса  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Glory
Потому что Nested loops _всегда_ что-то сканирует.
Не всегда. Вернее всегда, но иногда скан в плане нарисовн как сик.
31 окт 12, 13:25    [13401966]     Ответить | Цитировать Сообщить модератору
 Re: на что обращать внимание при чтении плана выполнения запроса  [new]
НОВИЧОК_2
Guest
Оптимальность для меня быстрота, а значит и минимальные операции по IO, обработку данных ит.д. Захваченные ресурсы, блокировки и другие смежные процессы в расчет не принимаются. Ибо все делаться будет ночью, когда нет других нагрузок
Я ожидал советов от гуру в виде таких советов: избегать появления таких узлов, индекс нужен по тем полям которые лукапятся ит.д. Одним словом на что обращает внимание при чтении планов гуру? и что скажите по моим 2 планам выше
31 окт 12, 13:37    [13402103]     Ответить | Цитировать Сообщить модератору
 Re: на что обращать внимание при чтении плана выполнения запроса  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
НОВИЧОК_2
Оптимальность для меня быстрота, а значит и минимальные операции по IO, обработку данных ит.д. Захваченные ресурсы, блокировки и другие смежные процессы в расчет не принимаются. Ибо все делаться будет ночью, когда нет других нагрузок
Я ожидал советов от гуру в виде таких советов: избегать появления таких узлов, индекс нужен по тем полям которые лукапятся ит.д. Одним словом на что обращает внимание при чтении планов гуру? и что скажите по моим 2 планам выше
Время и статистику вы можете получить сами. Угадывать их по обрывочным скриншотам плана, без текста запросов и распределения данных никто не будет. И да, there's no silver bullet.
31 окт 12, 13:40    [13402135]     Ответить | Цитировать Сообщить модератору
 Re: на что обращать внимание при чтении плана выполнения запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
НОВИЧОК_2
Оптимальность для меня быстрота, а значит и минимальные операции по IO, обработку данных ит.д.

И где в плане вы увидели это IO ? Обработку данных ?

НОВИЧОК_2
Я ожидал советов от гуру в виде таких советов: избегать появления таких узлов, индекс нужен по тем полям которые лукапятся ит.д.

Вы наивно полагаете, что существует один единственный самый лучший в мире план ?


НОВИЧОК_2
Одним словом на что обращает внимание при чтении планов гуру?

Table/Index Spool
31 окт 12, 13:40    [13402139]     Ответить | Цитировать Сообщить модератору
 Re: на что обращать внимание при чтении плана выполнения запроса  [new]
НОВИЧОК_2
Guest
Вот 2 запроса

SELECT TOP 1000 A.*
FROM ACCOUNTS A
CROSS APPLY (SELECT TOP 1 AA.ID, AA.B, AA.S, AA.X
FROM ACCOUNTS AA
WHERE AA.B = A.B
AND AA.S = A.S
ORDER BY AA.X DESC) HH
WHERE HH.ID = A.ID
ORDER BY A.B, A.S

GO

SELECT TOP 1000 A.*
FROM ACCOUNTS A
WHERE A.ID IN
(
SELECT TOP 1 AA.ID FROM ACCOUNTS AA
WHERE AA.B = A.B
AND AA.S = A.S
ORDER BY AA.X DESC)
ORDER BY A.B, A.S
31 окт 12, 14:00    [13402282]     Ответить | Цитировать Сообщить модератору
 Re: на что обращать внимание при чтении плана выполнения запроса  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
НОВИЧОК_2
Оба запроса возвращают идентичные данные. То что я хочу я получил. Теперь я хочу понять какой запрос использовать и какой не загнется если реальных данных будут намного больше. Я понимаю что в теории все мы должны знать что хотим и чего и как. Вернемся к практике. Какой из этих планов наиболее оптимален и САМОЕ ГЛАВНОЕ ПОЧЕМУ

План - выбранный сервером путь для достижения результата. Я возможно не очень понятно высказал свою мысль. Представьте себе аналогию с дорогой от дома до работы. Вам дали карту города, на которой начертили два маршрута и спрашивают, какой самый оптимальный?
Сразу возникают вопросы, оптимальный по какому критерию? По времени? По количеству километров? По комфорту?
Допустим вы выбрали критерий время. Тогда возникает вопрос, а сколько по времени занимает каждый маршрут, если на карте не обозначено ни движения автобусов, ни метро, ни загруженность дорог?
Ок, просто глядя на маршрут (картинки планов, которые вы привели) можно сказать какой оптимальнее, если вы знаете какой самый оптимальный. Например, "тут я иду 5 минут пешком, тут сажусь на маршрутку, пересаживаюсь на метро еду 20 минут - я на работе", так быстрее всего. Тогда сравниваете два предложенных маршрута и смотрите: ага, вместо того, чтобы пересаживаться на метро, я пересаживаюсь на автобус и стою два часа в пробке - нужно изменить этот пункт плана. То же самое и тут, вы знаете, что у вас из таблицы в 10 миллионов строк должно выбраться 10 записей, но план показывает, что сканируется вся таблица - значит, нужно посмотреть почему. Как искать такие места на практике, я уже сказал.
Если ваша задача просто сравнить два плана, то соответственно выбирайте критерий, время, чтения или еще что-то, включайте статистику и сравнивайте. Только тогда непонятно, зачем вы картинки привели, привели бы результаты set statistics io, time on, было бы понятнее.

НОВИЧОК_2
в первом случае 52% идет на сканирование кластерного индекса - это плохо и дорого

select * from t1 - clustered index scan - 100%, это плохо, будем избавляться?
31 окт 12, 14:30    [13402547]     Ответить | Цитировать Сообщить модератору
 Re: на что обращать внимание при чтении плана выполнения запроса  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
НОВИЧОК_2
Вот 2 запроса

SELECT TOP 1000 A.*
FROM ACCOUNTS A
CROSS APPLY (SELECT TOP 1 AA.ID, AA.B, AA.S, AA.X
FROM ACCOUNTS AA
WHERE AA.B = A.B
AND AA.S = A.S
ORDER BY AA.X DESC) HH
WHERE HH.ID = A.ID
ORDER BY A.B, A.S

GO

SELECT TOP 1000 A.*
FROM ACCOUNTS A
WHERE A.ID IN
(
SELECT TOP 1 AA.ID FROM ACCOUNTS AA
WHERE AA.B = A.B
AND AA.S = A.S
ORDER BY AA.X DESC)
ORDER BY A.B, A.S

Я бы лучше вот так сделал
with cte as
(
	select 
		*,
		rn = row_number() over (partition by a.b, a.s order by a.x desc)
	from
		accounts a	
)
select top(1000) * from cte where rn = 1;
31 окт 12, 14:40    [13402617]     Ответить | Цитировать Сообщить модератору
 Re: на что обращать внимание при чтении плана выполнения запроса  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
SomewhereSomehow
Я бы лучше вот так сделал
with cte as
(
	select 
		*,
		rn = row_number() over (partition by a.b, a.s order by a.x desc)
	from
		accounts a	
)
select top(1000) * from cte where rn = 1;


боюсь, что не выполнится условие
НОВИЧОК_2
Теперь я хочу понять какой запрос использовать и какой не загнется если реальных данных будут намного больше
31 окт 12, 14:54    [13402735]     Ответить | Цитировать Сообщить модератору
 Re: на что обращать внимание при чтении плана выполнения запроса  [new]
SomewhereSomehow
Member

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

Надо просто проверить.
Но почему вы так подумали?
31 окт 12, 14:58    [13402774]     Ответить | Цитировать Сообщить модератору
 Re: на что обращать внимание при чтении плана выполнения запроса  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
SomewhereSomehow, да тут недавно пытался применить ROW_NUMBER на таблице более 600 миллионов записей
TempDВ выросла до огромных размеров и практически убила сервак (у меня есть трудности с ресурсами сервера)
Пришлось изголятся и делать по другому

ЗЫЖ хотя может я просто не умею их готовить
31 окт 12, 15:11    [13402901]     Ответить | Цитировать Сообщить модератору
 Re: на что обращать внимание при чтении плана выполнения запроса  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
а нафига в cross apply вот эти поля , AA.B, AA.S, AA.X ? можно же и без них
31 окт 12, 15:15    [13402944]     Ответить | Цитировать Сообщить модератору
 Re: на что обращать внимание при чтении плана выполнения запроса  [new]
SomewhereSomehow
Member

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

Может быть, это потому, что в предложениях partition by, order by использовались ключи, по которым нет индекса и выбирались все поля таблицы, по этому, сервер вынужден был делать явную сортировку всей таблицы, которая, как известно, потребляет память. Если таблица большая, то высока вероятность, что все не влезет и будет кусками сливаться в tempdb. Если обеспечить сортировку при сканировании, должно быть ок. Хотя если индекса нет и сделать нельзя, то возможно такой вариант не подойдет.
Но top в свою очередь, мешает серверу раскрыть подзапрос, и он может быть выполнен много раз.
Нужно смотреть что лучше или хуже, исходя из реалий, ну и конечно, тестировать на репрезентативных данных. Ибо какой смысл тестировать производительность, если условия потом будут другие.
31 окт 12, 15:28    [13403061]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить