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

 

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

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

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 59 60 61 62 63 64 < 65 > 66 67 68 69 70 71 .. 161 >> Следующая


¦ LOOP и HASH. Две этих подсказки могут находиться сразу же перед ключевым словом JOIN в разделе FROM. Они принуждают SQL Server выполнить указанное соединение указанным методом. Для того чтобы применять эти подсказки, необходимо использовать синтаксис соединения в новом стиле, с ключевым словом JOIN в разделе FROM. Если указана хотя бы одна подсказка этого типа, то все соединения будут выполнены в том же порядке, в каком псевдонимы перечислены в FROM.

¦ 0PTI0N(L00P JOIN). Эта подсказка находится в конце запроса и приказывает выполнять все соединения методом вложенных циклов.

¦ OPTION(FORCE ORDER). Эта подсказка находится в конце запроса и приказывает выполнять все соединения в том порядке, в котором в разделе FROM перечислены псевдонимы таблиц.

¦ 0PTI0N(FAST 1). Эта подсказка просто принуждает SQL Server попытаться выдать первые строки как можно быстрее, что обычно приводит к выбору плана выполнения с вложенными циклами. Она работает почти как подсказка ОРТ ION (LOOP JOIN), хотя теоретически SQL Server может понять, что никакой план выполнения не сможет быстро вернуть первые строки, если в запросе явно присутствует ORDER BY, сводящий на нет эффект OPTION (FAST 1). Подсказка OPTION (FAST 1) эквивалентна подсказке FIRST R0WS в Oracle и подсказке OPTIMIZE FOR I ROW в DB2. Подсказки вполне можно комбинировать. Например, в одну фразу WITH можно

вставить несколько подсказок, разделяя их запятыми: WITH (INDEX(Empl oyee_Fi rst_Name). N0L0CK). Несколько подсказок во фразе OPTION также разделяются запятыми, например, 0PTI0N(L00P JOIN. FORCE ORDER). Вместе эти подсказки обеспечивают полный контроль над порядком соединения, методами соединения и методами доступа к таблицам.

Примеры подсказок

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

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

M.First_Name. M.Last_Name. LM.Description
128

4. Управление планами выполнения

FROM Employees E WITH (INDEX(Employee_Last_Name))

INNER JOIN Locations LE WITH (INDEX(Location_PKey))

ON E.Location_ID-LE.Location_ID INNER JOIN Employees M WITH (INDEX(Employee_PKey))

ON E.Manager ID-M.Employee ID INNER JOIN Locations LM WITH (INDEX(Location_PKey))

ON M.Location_ID-LM.Location_ID WHERE E.Last_Name - 'Johnson'

AND LE.Deseription-'Dallas'

OPTION(LOOP JOIN, FORCE ORDER)

SET SHOWPLAN_TEXT ON (as described in Chapter 3) generates the following results when you run this query from SQL Server Query Analyzer:

StmtText

!--Bookmark Lookup(...(...[Locations] AS [LM]))

!--Nested Loopsdnner Join)

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

!--Nested Loopsdnner Join)

--Fi I ter(WHERE:([LE].[Descri pti on]-'Dall as'))

!--Bookmark Lookup(...(...[Locations] AS [LE]))

!--Nested Loopsdnner Join)

I--Bookmark Lookup(...(...[Employees]

(wrapped line) AS [E]))

I I I I —Index Seek(...(...

(wrapped line) [Employees].[Employee_Last_Name]

(wrapped line) AS [E]). SEEK:([E].[Last_Name]-'Johnson') ORDERED)

I I I--Index

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

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

(wrapped line) ORDERED)

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

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

!--Index Seek(..(...[Locations].[Location_PKey]

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

(wrapped line) ORDERED)

(12 row(s) affected)

Если вы не хотите использовать только вложенные циклы, вам могут потребоваться подсказки HASH и LOOP, как показано в следующем варианте последнего запроса:

SELECT E.First_Name, E.Last_Name. Е.Sal агу. LE.Description,

M.First_Name, M.Last_Name, LM.Description FROM Employees E WITH (INDEX(Employee_Last_Name))

INNER HASH JOIN Locations LE WITH (INDEX(Location_Description))

ON E.Location_ID=LE.Location_ID INNER LOOP JOIN Employees M WITH (INDEX(Employee_PKey))

ON E.Manager ID-M.Employee_ID INNER LOOP JOIN |_ocatiOns-LM WITH (INDEX(Location_PKey))

ON M.Location_ID-LM.Location_ID WHERE E.Last_Name = 'Johnson'

AND LE.Description-'Dallas'

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

при помощи SET SHOWPLAN_TEXT ON:

StmtText

!--Bookmark Lookup(...(...[Locations] AS [LM])) !--Nested Loopsdnner Join)
Управление планами в SQL Server

129

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

I !--Nested Loopsdnner Join)

I |--HashMatch(InnerJoin...

(wrapped line) ([E].[Location_ID])-([LE].[Location_ID])...)

I-"Bookmark Lookup(...(...[Employees] AS [E]))

I |--Index (...[Employees].[Employee_Last Name]

SEEK:([E].[LastJame]-'Johnson') ORDERED)

!--Bookmark Lookup(...(...[Locations] AS [LE])) I--Index
Предыдущая << 1 .. 59 60 61 62 63 64 < 65 > 66 67 68 69 70 71 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100