Программирование >>  Полное сканирование таблицы 

1 ... 24 25 26 [ 27 ] 28 29 30 ... 107


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

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

index name index description indexkeys

EmployeeManagerlD nonclustered located on PRIMARY Manager ID

Employee Last Name nonclustered located on PRIMARY Lastjame

Employee Location ID nonclustered located on PRIMARY LocationID

Employee Department ID nonclustered located on PRIMARY DepartmentID

Employee~Hire Date nonclustered located on PRIMARY Hire Date

EmployeePKey nonclustered. unique located on PRIMARY Employee ID

Empl oyee~Fi rstjame nonclustered located on PRIMARY Fi rstjame

Employeejickname nonclustered located on PRIMARY Nickname

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

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

я объяснил, как узнать порядок соединения, методы соединения и методы доступа к таблицам для надежного плана выполнения, показанного ранее. Если вы объедините эти знания с основами, изложенными в главе 2, то сможете понять, как SQL Server обращается к данным, от начала до конца. Чтобы проверить ваще понимание, попробуйте изложить полный план выполнения на обычном языке, как набор инструкций для базы данных. Сравните ващи результаты со следующим изложением. Если возникло слишком много разногласий, попробуйте еще раз после того, как прочитаете еще несколько планов вьшолнения, чтобы проверить, насколько углубилось понимание. Далее план вьшолнения описан в повествовательной форме, как инструкции для базы данных.

1. Используя условие Е. Lastjame = Stevenson, перейти к индексу EMPLOVEEJASTJAI и найти список идентификаторов строк, соответствующих сотрудникам с запрошенной фамилией.

2. Для каждого идентификатора строки из предыдущего шага считать один блок (логическое считывание; если требуется, физическое) из таблицы Empl oyees (Е),



используя ту часть идентификатора, где хранится адрес блока. Используя ту часть идентификатора, где хранится адрес строки, найти определенную строку, на которую указывает идентификатор, и считать из нее все необходимые данные (запрошенные для псевдонима Е).

3. Для каждой такой строки, используя условие соединения Е. Location ID=LE. Locati on ID, перейти к индексу по первичному ключу LOCATION PKEY и найти один подходящий идентификатор строки, соответствующий записи о местоположении для сотрудника, чью запись вы уже считали. Если подходящей строки не найдено, отбросить результирующую строку, которая строится в данный момент.

4. В ином случае для подходящего идентификатора строки из предьщущего шага считать один блок (логическое считывание; если необходимо, физическое) из таблицы Locations (LE), используя ту часть идентификатора, где хранится адрес блока. Используя идентификатор, хранящий адрес строки, найти определенную CTpoicy, на которую указывает данный идентификатор, и считать из нее все необходимые данные (запрошенные для псевдонима LE). Присоединить подходящие данные к входной строке, полученной при предыдущем считывании из таблицы, чтобы построить частичную результирующую строку.

5. Для каждой такой строки отбросить всю результирующую строку, если ее данные не отвечают условию UPPER(LE.Description) = SAN FRANCISCO.

6. Для каждой оставшейся строки, используя условие соединения Е. Manager ID=M. Enployee ID, перейти к индексу по первичному ключу EMPLOYEE PKEY и найти единственный подходящий идентификатор строки, соответствующий записи сотрудника, для менеджера того сотрудника, запись которого вы уже считали. Если подходящей строки не найдено, отбросить результирующую строку, которая строится в данный момент.

7. В ином случае для подходящего идентификатора строки из предыдущего шага считать один блок (логическое считывание; если требуется, физическое) из таблицы Enpl oyees (М), используя ту часть идентификатора, где хранится адрес блока. Используя ту часть идентификатора, где хранится адрес строки, найти определенную строку, на которую указывает идентификатор, и считать из нее все необходимые данные (запрошенные для псевдонима М). Присоединить подходящие данные ко входной строке, полученной при предыдущих считываниях из таблиц, чтобы создать частичную результирующую строку.

8. Для каждой такой строки, используя условие соединения М. Locati on ID = LM. Lo-cation ID, перейти к индексу по первичному ключу LDCATION PKEY и найти единственный подходящий идентификатор строки, соответствующий записи о местоположении для менеджера сотрудника, чью запись вы уже считали. Если подходящей строки не найдено, отбросить результирующую строку, которая строится в данный момент.

9. Иначе для подходящего идентификатора строки из предыдущего шага считать один блок (логическое считывание; если т)ебуется, физическое) из таблицы Locations (LM), используя ту часть пдеити()икатера, где хранится адрес блока. Используя ту часть пдс1ГГИ()П1с;п()ра. где хранится адрес строки, найти определенную строку, иа 1соторую уv.. идентификатор строки, и считать из нее все необходимые лапиые (.i;m)oii4 тые для псевдонима LM). Присоединить



Чтение планов выполнения в SQL Server 93

подходящие данные ко входной строке, полученной при предыдущих считываниях из таблиц, чтобы заверщить и немедленно возвратить полностью построенную результирующую строку.

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

в планах выполнения часто используются методы соединения, отличные от вложенных циклов, - особенно это касается сырых планов, которые вам потребуется настроить. Далее я покажу вам пример, где вместо надежных соединений со вложенными циклами выполняются соединения хэшированием. Если удалить все индексы и добавить в конце запроса подсказку OPTION(HASH JOIN), SQL Server создаст новый план выполнения: StmtText

SELECT E.First Name. E.Last Name. E.Salary. LE.Description.

M.First Name, M.Last Name. LM.Description FROM Locations LE. Locations LM, Employees M. Employees E WHERE E.Last Name = Stevenson

AND E.ManagerJD=M.Employee ID

AND E.Location ID=LE.Location ID

AND M.Location ID=LM.Location ID

AND UPPER(LE.Description) = SAN FRANCISCO

OPTIONCHASH JOIN)

(1 row(s) affected) StmtText

-Hash MatchCInner Join. ...([LM].[Location ID])-([M].[LocationJD])....) -ТаЫе Scan(...(...[Locations] AS [LM])) I--Hash Matchdnner Join, (wrapped line) .. .([M].[Emp1oyee ID])4[E].[Manager ID])....) --Table Scan(...(...[Employees] AS [M])) -Hash Matchdnner (wrapped line) ... ([E].[Location ID])=([LE]. [LocationJD])....)

[--Table Scan(...(...[Employees] AS [E]). (wrapped line) WHERE:([Е].[Last Name]=Stevenson))

I-Fi 1 ter(WHERE: (upper( [LE]. [Descri ption] )= (wrapped line) SAN FRANCISCO))

1-Table Scan(...(...[Locations] AS [LE]))

(8 row(s) affected)

Здесь любой доступ к таблице выполняется путем полного сканирования таблицы. Запрос начинает выполняться на LE и отфильтровывает местоположения с подходящим описанием. Следующая таблица, к которой производится доступ, - это Е, из которой отфильтровываются сотрудники с подходящей фамилией. Полученные из этих двух таблиц строки хэшируются и соединяются. Затем результат соединяется хэшированием с результатом полного сканирования М и, в итоге, с результатом полного сканирования LM.

Сложные планы выполнения

Существуют и другие возможности планов вьшолнения, например индикаторы, указывающие, какие из соединений являются внешними, перечисление шагов сор-



1 ... 24 25 26 [ 27 ] 28 29 30 ... 107

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика