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

Откуда: Москва
Сообщений: 2791
По какому из вариантов работает этот план запроса:

StmtText
------------------------------------------------------------------------------------------------------
select a.aid,a.adata,b.bid,b.bdata,c.cid,c.cdata from a join b on b.bid=a.bid join c on c.cid=b.cid

StmtText
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
  |--Nested Loops(Inner Join, OUTER REFERENCES:([Bmk1004]))
       |--Nested Loops(Inner Join, OUTER REFERENCES:([db].[dbo].[b].[cid]))
       |    |--Nested Loops(Inner Join, OUTER REFERENCES:([db].[dbo].[a].[bid]))
       |    |    |--Clustered Index Scan(OBJECT:([db].[dbo].[a].[a_pk]))
       |    |    |--Clustered Index Seek(OBJECT:([db].[dbo].[b].[b_pk]), SEEK:([db].[dbo].[b].[bid]=[db].[dbo].[a].[bid]) ORDERED FORWARD)
       |    |--Index Seek(OBJECT:([db].[dbo].[c].[c_pk]), SEEK:([db].[dbo].[c].[cid]=[db].[dbo].[b].[cid]) ORDERED FORWARD)
       |--RID Lookup(OBJECT:([db].[dbo].[c]), SEEK:([Bmk1004]=[Bmk1004]) LOOKUP ORDERED FORWARD)

A. Считывает 1ю строку из a_pk. Для неё находит и считывает строку из b_pk. Для неё находит и считывает строку из c_pk. Для неё находит и считывает строку из c (heap).
Считывает 2ю строку из a_pk. Для неё находит и считывает строку из b_pk. Для неё находит и считывает строку из c_pk. Для неё находит и считывает строку из c (heap).
И так далее до последней строки из a_pk.
B. Считывает 1ю строку из a_pk. Для неё находит и считывает строку из b_pk.
Считывает 2ю строку из a_pk. Для неё находит и считывает строку из b_pk.
И так далее до последней строки из a_pk.
Для полученного объединения a_pk и b_pk последовательно находит и считывает строки из c_pk.
Для полученного объединения a_pk, b_pk b c_pk последовательно находит и считывает строки из c (heap).

К сообщению приложен файл. Размер - 65Kb
30 окт 14, 08:37    [16775976]     Ответить | Цитировать Сообщить модератору
 Re: Как работает план запроса?  [new]
SomewhereSomehow
Member

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

Nested Loops не блокирующий итератор, поэтому, вариант А.
30 окт 14, 08:55    [16776030]     Ответить | Цитировать Сообщить модератору
 Re: Как работает план запроса?  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2791
SomewhereSomehow
Nested Loops не блокирующий итератор, поэтому, вариант А.

А какие блокирующие?
30 окт 14, 09:11    [16776071]     Ответить | Цитировать Сообщить модератору
 Re: Как работает план запроса?  [new]
SomewhereSomehow
Member

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

- Sort, TopN Sort, Distinct Sort
- Hash (для фазы Build)
- Table/Index Eager Spool, Row Count Spool
- Scalar Stream Aggregate
- Remote Range/Scan/Query/Fetch/Modify
- Batch Hash Table Build
- UDX Check/XmlSerialize/Compile

Еще немного про итераторы: Properties of Iterators
30 окт 14, 10:10    [16776261]     Ответить | Цитировать Сообщить модератору
 Re: Как работает план запроса?  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2791
Хорошо. А есть ли смысл разместить a_pk в первой файловой группе, b_pk - во второй, c_pk в третьей, с (heap) в четвёртой? Или, может быть, a_pk и c_pk в первой, а b_pk и c (heap) - во второй?
30 окт 14, 17:03    [16778591]     Ответить | Цитировать Сообщить модератору
 Re: Как работает план запроса?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Prolog, а что не устраивает в запросе-то?
30 окт 14, 17:10    [16778632]     Ответить | Цитировать Сообщить модератору
 Re: Как работает план запроса?  [new]
SomewhereSomehow
Member

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

Оптимизатору нет дела до подсистемы хранения (Storage Engine), ему все равно, так что решайте сами.
30 окт 14, 17:15    [16778670]     Ответить | Цитировать Сообщить модератору
 Re: Как работает план запроса?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Prolog
Хорошо. А есть ли смысл разместить a_pk в первой файловой группе, b_pk - во второй, c_pk в третьей, с (heap) в четвёртой? Или, может быть, a_pk и c_pk в первой, а b_pk и c (heap) - во второй?
Если файловые группы лежат на массивах с различающейся производительностью, то, возможно, имеет.
30 окт 14, 17:41    [16778850]     Ответить | Цитировать Сообщить модератору
 Re: Как работает план запроса?  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2791
Гавриленко Сергей Алексеевич
Если файловые группы лежат на массивах с различающейся производительностью, то, возможно, имеет.
Дисковый массив, вообще, один. В этом случае есть ли смысл разносить таблицы и индексы по разным файлам, или сложить их все в один файл?
30 окт 14, 18:36    [16779098]     Ответить | Цитировать Сообщить модератору
 Re: Как работает план запроса?  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2791
Владислав Колосов
Prolog, а что не устраивает в запросе-то?
В запросе меня всё устраивает.
Помниться, были рекомендации, что некластерные индексы нужно размещать на отдельные файлы от файлов для кучи и кластерного индекса, а также индексы таблиц, которые используются при объединении через join, также лучше размещать на разных файлах. Вопрос чисто теоретический - есть ли практический смысл это делать? Даже если имеется всего лишь один дисковый массив.
30 окт 14, 18:47    [16779136]     Ответить | Цитировать Сообщить модератору
 Re: Как работает план запроса?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Prolog
Гавриленко Сергей Алексеевич
Если файловые группы лежат на массивах с различающейся производительностью, то, возможно, имеет.
Дисковый массив, вообще, один. В этом случае есть ли смысл разносить таблицы и индексы по разным файлам, или сложить их все в один файл?
Файлов имеет смысл делать несколько -- в зависимости от кол-ва ядер -- чтобы избегать всяких мерзких contention. Правильную ссылку не нашел, но вот мельком есть тут: http://technet.microsoft.com/en-us/library/cc966534.aspx
30 окт 14, 19:20    [16779248]     Ответить | Цитировать Сообщить модератору
 Re: Как работает план запроса?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Prolog
Владислав Колосов
Prolog, а что не устраивает в запросе-то?
В запросе меня всё устраивает.
Помниться, были рекомендации, что некластерные индексы нужно размещать на отдельные файлы от файлов для кучи и кластерного индекса, а также индексы таблиц, которые используются при объединении через join, также лучше размещать на разных файлах. Вопрос чисто теоретический - есть ли практический смысл это делать? Даже если имеется всего лишь один дисковый массив.
Если массив один - нет.
30 окт 14, 19:21    [16779254]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить