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

 

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

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

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 149 150 151 152 153 154 < 155 > 156 157 158 159 160 .. 161 >> Следующая


Это похоже на план выполнения, который вы выбрали, анализируя SQL-код сверху вниз. Ho есть небольшая проблема — таблица Products обрабатывается до Shipments. Впрочем, это практически никак не будет влиять на время выполнения запроса. Так как несовместимость типов, затрагивающая Phone_Number, может потребовать исправления в SQL Server и Oracle, вам нужно немедленно опробовать модифицированный вариант в других базах данных.

Получение плана выполнения в SQL Server

Подозревая, что уже получили решение проблемы производительности этого запроса, вы запускаете SQL Server Query Analyzer и используете showplan_text, чтобы посмотреть краткое представление плана выполнения оператора, в котором несовместимость типов была исправлена при помощи С.Phone_Number = '6505551212'. Щелчок по кнопке Execute-Query в Query Analyzer выдает следующий результат:

StmtText

|--Bookmark LookupC...(...[Products] AS [Р]))

!--Nested Loopsdnner Join)

!--Bookmark LookupC[Addresses] AS [A]))

I !--Nested LoopsCInner Join)

I I-SortCORDER BY:([0].[Customer_ID] ASC. (wrapped line) [0].[0rder_ID] DESC.

(wrapped line) [0D].[Shipment_ID] ASC. [0D].[0rder_Detail_ID] ASC))

I I I --Bookmark Lookup(...(...[Shipments] AS [S]))

I I |--Nested Loopsdnner Join)

I I !--Bookmark

(wrapped line) Lookup(...(...[0rder_Details] AS [OD]))

I I I !--Nested Loopsdnner Join)

I

I

I I --FiIter(WHERE:([0].[Business_Unit_ID] =

I |--Bookmark

I

!--Nested

10))

(wrapped

(wrapped

(wrapped (wrapped

(wrapped (wrapped (wrapped

(wrapped (wrapped (wrapped

(wrapped (wrapped

(wrapped (wrapped ORDERED)

I |--Index Seek(...(...[Addresses].[Address_PKey]

(wrapped line) AS [A]). SEEK:([A].[Address_ID] = [S].[Address_ID]) ORDERED)

I I I

line) Lookup(...(...[Orders] AS [0]))

I I I

line) Loopsdnner Join)

I I I

line) Lookup(...(... line) [Customers] AS [C]))

I I I

line) SeekC____(___

Iine) [Customers].[Customer_Phone_Number]

line) AS [C]). SEEK:С[C].[Phone_Number] = '6505551212') ORDERED)

II Il I-Index

line) Seek(...(...

line) [Orders].[Order_Customer_ID] AS [0]).

line) SEEK:([0].[Customer_ID] = [C].[Customer_ID]) ORDERED)

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

Iine) [Order_DetaiIs].[Order_Detail_0rder_ID]

line) AS [OD]). SEEK:([OD].[Order_ID] = [0].[Order_ID]) ORDERED)

I I |--Index

line) Seek(...(...[Shipments].[Shipment_PKey]

line) AS [S]). SEEK:([S].[Shipment_ID] = [OD].[Shipment_ID]) (wrapped line)

!--Bookmark

I--Index
Изменение SQL-кода для получения хорошего плана

319

I--Index SeekC[Products].[Product_PKey]

(wrapped line) AS [P]). SEEK:([P].[Product_ID] *= [OD].[Product_ID]) ORDERED)

(19 row(s) affected)

Хорошие новости! С исправленным SQL-кодом вы получаете оптимальный план. Просто из любопытства можно проверить план выполнения для исходного SQL-кода и получить тот же самый результат! Очевидно, SQL Server выполняет преобразование данных для константы, не запрещая использование индекса.

Изменение базы данных для получения лучшего плана

Предыдущие результаты в DB2 и SQL Server уже продемонстрировали, что в дизайне базы данных есть все необходимые индексы, чтобы использовать желаемый план выполнения. Ho в Oracle могут отсутствовать индексы, которые существуют в других базах данных. Таким образом, вы можете пропустить этот шаг. Однако если бы вы еще не знали, что индексы существуют, то проверили бы, есть ли индексы по Customers(Phone_Number), Orders(Customer_ID) и Order_Details(Order_ID), используя методы, описанные в главе 3. Обычно можно принять как должное, что необходимые индексы по первичным ключам уже существуют. Проверяйте отсутствующие индексы по первичному ключу, только когда наиболее вероятная причина неправильного плана выполнения не объясняет проблему и заставляет проверить, нет ли каких-нибудь иных источников проблем.

Изменение SQL-кода для получения хорошего плана

Можно предположить, что хороший план в Oracle можно получить после исправления несовместимости типов на этой платформе. Как-никак, другие базы данных сумели избежать преобразования типа индексированного столбца и выдали хороший план. Поэтому стоит испытать новый план в Oracle, но с исправленным сравнением С. Phone_Number = ' 6505551212', чтобы избежать неявного преобразования типов данных. Используйте исходные настройки для синтаксической оптимизации, чтобы проверить план выполнения:

PLAN

SELECT STATEMENT SORT ORDER BY NESTED LOOPS NESTED LOOPS NESTED LOOPS NESTED LOOPS NESTED LOOPS TABLE ACCESS BY INDEX ROWID 4*CUST0MERS INDEX RANGE SCAN CUST0MER_PH0NE_NUMBER TABLE ACCESS BY INDEX ROWID 1*0RDERS
320

Приложение Б. Полный и непрерывный процесс

INDEX RANGE SCAN ORDER CUSTOMER ID TABLE ACCESS BY INDEX ROWID 2*0RDERJlETAILS INDEX RANGE SCAN ORDER_DETAIL_ORDER_ID TABLE ACCESS BY INDEX RDWID 5*SHIPMENTS INDEX UNIQUE SCAN SHIPMENT PKEY TABLE ACCESS BY INDEX RDWID 3*PR0DUCTS INDEX UNIQUE SCAN PRODUCT PKEY TABLE ACCESS BY INDEX ROWID 6*ADDRESSES INDEX UNIQUE SCAN ADDRESSJ1KEY
Предыдущая << 1 .. 149 150 151 152 153 154 < 155 > 156 157 158 159 160 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100