Читать реферат по информатике, вычислительной технике, телекоммуникациям: "Новые возможности MS SQL Server 2004 "Yukon"" Страница 6
уникальному идентификатору записи – RID, который однозначно определяет ее положение в файле данных. Если же кластерный индекс в таблице присутствует, то физическое место этой записи не постоянно, а, следовательно, использовать RID не очень практично, поскольку его пришлось бы обновлять во всех индексах при каждом изменении. Поэтому запись идентифицируется по ключу кластерного индекса.
Допустим, необходимо выбрать поле одной из записей в таблице по какому-нибудь условию. В этом случае, в зависимости от наличия индексов, сервер может поступить несколькими способами.
Поле, которое надо выбрать, совпадает с полем, по которому нужно осуществить поиск, и по этому полю построен индекс.
| SELECT LastName FROM employees WHERE LastName = 'Callahan' |
План такого запроса прост и незатейлив:
| |--Index Seek(OBJECT:([Employees].[LastName]),SEEK:([Employees].[LastName]=Convert([@1])) ORDERED FORWARD) |
Нужное значение просто находится по индексу.
Поле, которое необходимо просмотреть, не совпадает с полем, по которому нужно искать, но при этом по полю поиска построен кластерный индекс.
| SELECT LastName FROM Employees WHERE EmployeeID = 8 |
План такого запроса также не отличается излишней сложностью:
| |--Clustered Index Seek(OBJECT:([Employees].[PK_Employees]),SEEK:([Employees].[EmployeeID]=Convert([@1])) ORDERED FORWARD) |
Все закономерно – идет поиск по кластерному индексу, а затем извлекается нужное поле из этого индекса.
Поле, которое надо достать из таблицы, не совпадает с полем, по которому производится поиск, и по полю поиска построен самый обычный индекс.
| SELECT LastName FROM Employees WHERE PostalCode = '98105' |
Вот здесь уже серверу приходится совершать дополнительные телодвижения, и план запроса немного усложняется:
| |--Bookmark Lookup(BOOKMARK:([Bmk1000]), OBJECT:([Employees]))|--Index Seek(OBJECT:([Employees].[PostalCode]),SEEK:([Employees].[PostalCode]=Convert([@1])) ORDERED FORWARD) |
Сначала по индексу находится нужная запись, а точнее, не запись, а ссылка на запись. При этом значения поля, которое на самом деле надо достать из таблицы, по-прежнему нет, так как поле поиска не является нужным полем, как это было в первом случае. На данный момент у сервера, как уже говорилось, есть только ссылка, и чтобы извлечь нужное поле, надо выполнить еще одну операцию – bookmark lookup. Стоимость этой операции в некоторых случаях может быть очень высока, например, в этом запросе она составляет половину всей его стоимости (49%). В случае с кластерным индексом такого не происходит, потому что в листьях кластерного индекса содержится вся запись, а значит, ничего искать уже не надо.
| ПРИМЕЧАНИЕ Естественно, в реальных задачах, планы выполнения запросов могут быть гораздо более сложными. Многое зависит от селективности индексов, статистики, доступной памяти и других факторов, но рассмотрение этих высоких материй выходят за рамки данной статьи. |
В силу того, что стоимость дополнительной операции по извлечению полей, не входящих в индекс, может быть довольно высока, то иногда приходится от нее избавляться. В предыдущих версиях Microsoft SQL Server был, фактически, только один способ избавится от дорогого bookmark lookup. Для этого строился составной (композитный) индекс, первым полем или полями которого являлись поля, входящие в условие поиска, а затем шли поля, которые необходимо было извлечь. Поскольку в
Похожие работы
Интересная статья: Быстрое написание курсовой работы

(Назад)
(Cкачать работу)