|
Программирование >> Полное сканирование таблицы
Все четыре операции считывания из таблиц производятся при помощи индекса, на что указывает фраза 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. Сложные планы выполнения Существуют и другие возможности планов вьшолнения, например индикаторы, указывающие, какие из соединений являются внешними, перечисление шагов сор-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |