Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Тоу Д. -> "Настройка SQL. Для профессионалов" -> 45

Настройка SQL. Для профессионалов - Тоу Д.

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 39 40 41 42 43 44 < 45 > 46 47 48 49 50 51 .. 161 >> Следующая


Если выполнить предыдущие команды на пустых таблицах, но иметь при этом статистику, то в окне результатов появится следующий выход (несущественный текст я заменил знаком миоготочия и, чтобы выход помещался на страницу, добавил выражение (wrapped 1 і re), указывая, что строка продолжается):

StmtText

SELECT E.First_Name. E.Last_Name. Е.Salary. LE.Description.

M.First_Name. M.Last_Name. LM.Description FROM Locations LE. Locations LM1 Employees M. Employees E
90

3. Просмотр и интерпретация планов выполнения

WHERE E.Last_Name = 'Stevenson'

AND E.Manager_ID=M.Employee_ID

AND E.Location_ID=LE.Location_ID

AND M.Location_ID=LM.Location_ID

AND UPPER(LE.Description) = 'SAN FRANCISCO'

(I row(s) affected)

StmtText

!--Bookmark Lookup(BO0KMARK:([Bmkl001]). OBJECT:([my_acct].[dbo].[Locations] AS [LM]))

I--Nested Loops(Inner Join)

!--Bookmark Lookup(...(...[Employees] AS [M]))

I !--Nested Loopsdnner Join)

I I --FiIter(WHERE:(upper([LE].[Description])=

(wrapped line) 'SAN FRANCISCO'))

I I |--Bookmark Lookup(...(...[Locations] AS [LE]))

I I |--Nested Loopsdnner Join)

I I I --Bookmark Lookup([Employees]

(wrapped line) AS [E]))

I I I I--Index Seek(...(...[Employees].

(wrapped line) [Emp_Last_Name] AS [E]). SEEK:([E].[Last_Name]='Stevenson')

(wrapped line) ORDERED)

I I I--Index

(wrapped line) Seek(...(...[Locations],[LocationPKey]

(wrapped line) AS [LE]). SEEK:([LE].[Location_ID]=[E].[Location_ID])

(wrapped line) ORDERED)

I |--Index Seek(...(...[Employees].[Employee_PKey]

(wrapped line) AS [M]). SEEK:([M].[Employee_ID]=[E].[Manager_ID]) ORDERED)

I--Index Seek(...(...[Locations],[Location_PKey]

(wrapped line) AS [LM]). SEEK:([LM].[Location_ID]=[M].[Location_ID])

(wrapped line) ORDERED)

(12 row(s) affected)

После первого выполнения анализа запроса две верхние строки, активизирующие выражение SHOWPLAN_TEXT, более не требуются. Для всех следующих запросов будут показаны только планы, пока вы не щелкнете по кнопке Query Analyzer Execute Query, чтобы выполнить следующую команду:

SET SHOWPLANTEXT OFF GO

Как интерпретировать план

План выполнения читается следующим образом.

¦ Все соединения проводятся при помощи вложенных циклов, на что указывает группа строк с выражением Nested Loopsdnner Join). Если вы используете различные методы соединения, первым будет выполнено соединение, находящееся максимально глубоко. Порядок выполнения соединений следует читать снизу вверх.

¦ Порядок доступа к таблицам: Empl oyees (E), Locati ons (LE), Empl oyees (M), Locati ons (LM)-B выходе плана выполнения они перечислены в обратном порядке. Если SQL-сервер обращается к одной таблице несколько раз, необходимо указывать псевдонимы для этой таблицы. Так как в плане выполнения псевдонимы указаны явно, нет никакой неопределенности относительно того, какой шаг выполняется для какого псевдонима.
Чтение планов выполнения в SQLServer

91

¦ Все четыре операции считывания из таблиц производятся при помощи индекса, на что указывает фраза Bookmark Lookup перед именами таблиц. Используемые индексы указаны ниже в строках с таким же отступом, что и соответствующие строки Bookmark Lookup. Так, вы видите, что к ведущей таблице E доступ осуществляется путем сканирования диапазона индекса EMPLOYEE LAST NAME (причем считывание хотя бы потенциально затрагивает несколько строк за раз). Доступ к остальным таблицам выполняется как уникальные считывания по первичным ключам таблиц. Так как все операции считывания, которые выполняются после обработки ведущей таблицы, относятся к уникальным соединениям, вы знаете, что максимальное количество строк, которые запрос может считать из любой таблицы, равно количеству строк, считанных из ведущей таблицы.

Когда вам встречается сканирование индекса, условие, следующее за именем индекса, объясняет, диапазон какого размера будет охвачен сканированием. Если необходимо узнать, какие еще индексы существуют для таблицы, то проще всего использовать хранимую процедуру sp helpindex. Результат выполнения такой команды выглядит следующим образом: sp helpindex Employees

index_name index_description indexkeys

EmployeeJIanagerID nonclustered located on PRIMARY Manager_ID

EmployeeJ_ast_Name nonclustered located on PRIMARY Last_Name

Employee_Location_ID nonclustered located on PRIMARY Location_ID

Employee Jtepartment_ID nonclustered located on PRIMARY Department ID

Employee~Hire_Date nonclustered located on PRIMARY Hire_Date

Employee_PKey nonclustered, unique located on PRIMARY Employee_ID

Employeerst_Name nonclustered located on PRIMARY First_Name

Employee_Mickname nonclustered located on PRIMARY Nickname

Если индекс охватывает несколько столбцов, они перечислены по порядку в столбце index_keys. Также получить полное описание таблицы с полным списком индексов таблицы можно при помощи spjiel р.

Интерпретация плана выполнения

Я объяснил, как узнать порядок соединения, методы соединения и методы доступа к таблицам для надежного плана выполнения, показанного ранее. Если вы объедините эти знания с основами, изложенными в главе 2, то сможете понять, как SQL Server обращается к данным, от начала до конца. Чтобы проверить ваше понимание, попробуйте изложить полный план выполнения на обычном языке, как набор инструкций для базы данных. Сравните ваши результаты со следующим изложением. Если возникло слишком много разногласий, попробуйте еще раз после того, как прочитаете еще несколько планов выполнения, чтобы проверить, насколько углубилось понимание. Далее план выполнения описан в повествовательной форме, как инструкции для базы данных.
Предыдущая << 1 .. 39 40 41 42 43 44 < 45 > 46 47 48 49 50 51 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100