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

 

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

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

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 111 112 113 114 115 116 < 117 > 118 119 120 121 122 123 .. 161 >> Следующая

238

7. Диаграммное изображение и настройка сложных SQL-запросов

Поскольку проверка селективных условий NOT EXISTS недорога, оказывается, вычислить уточненный коэффициент фильтрации подзапроса легко.

1. Измерьте q (количество строк, возвращенных внешним запросом, если удалить условие подзапроса NOT EXISTS) и t (количество строк, возвращенное полным запросом, включая подзапрос). Пусть С — количество таблиц в разделе FROM подзапроса (обычно для условий NOT EXISTS это число равно единице).

2. Пусть уточненный коэффициент фильтрации подзапроса равен (С - I + (t/q))/C.

Настройка запросов с подзапросами

Как и для простых запросов, оптимизация сложных запросов с подзапросами выполняется просто, если у вас есть правильная диаграмма запроса. Далее перечислены шаги оптимизации сложных запросов, включая подзапросы, на основе полной диаграммы запроса.

1. Преобразуйте все условия NOT IN в эквивалентные условия NOT EXISTS следуя описанному ранее шаблону.

2. Если корреляционное соединение — это соединение типа EXISTS, и подзапрос находится на главном конце этого соединения (то есть указатель стрелки посередине связи указывает вниз), преобразуйте сложный запрос в простой, как описано ранее, и настройте его, следуя обычным правилам для простых запросов.

3. Иначе, если корреляционное соединение — это соединение типа EXISTS, найдите наименьший корреляционный коэффициент предпочтения среди всех подзапросов типа EXISTS (если их больше одного). Если значение этого коэффициента меньше 1,0, преобразуйте это условие подзапроса в эквивалентное условие IN и выразите все остальные условия подзапросов типа EXISTS, явно применяя условие EXISTS. Оптимизируйте некоррелированный подзапрос IN, как если бы это был отдельный запрос; это начало плана исполнения всего запроса. После обработки некоррелированного подзапроса база данных выполнит операцию сортировки, чтобы выбросить повторяющиеся ключи коррелированного соединения из списка, созданного подзапросом. Следующее соединение после обработки этого первого подзапроса выполняется с коррелированным ключом во внешнем запросе, следуя индексу по этому ключу соединения, который должен быть индексирован. Начиная с этой точки, обрабатывайте внешний запрос, как если бы ведущий подзапрос не существовал, а первым узлом была бы ведущая таблица внешнего запроса.

4. Если все корреляционные коэффициенты предпочтения больше или равны 1,0 или если в запросе есть только условия подзапросов типа NOT EXISTS, выберите ведущую таблицу из внешнего запроса, как если бы в нем не было условий подзапроса, следуя обычным правилам для простых запросов.

5. Когда вы достигнете узлов внешнего запроса, которые включают полусоединения или антисоединения с еще не выполненными подзапросами, обрабатывайте каждый подзапрос, как если бы это был один находящийся ниже узел (даже если корреляционное соединение на самом деле вверх). Выбирайте точки выполнения оставшихся подзапросов, как если бы у этих виртуальных узлов был коэффициент фильтрации, равный уточненному коэффициенту фильтрации подзапроса.
Запросы с подзапросами

239

ПРИМЕЧАНИЕ--------------------------------------------------------------------------

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

6. Как только, выполнив шаг 5, вы помещаете коррелированное соединение в порядок соединения, сразу же выполняйте весь данный коррелированный подзапрос, оптимизируя план исполнения этого подзапроса, считая корреляционный узел ведущим узлом этого независимого запроса. Закончив обработку этого подзапроса, возвращайтесь к внешнему запросу и продолжайте оптимизировать дальнейший порядок соединения.

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

2,0.6°^1

/\ I 1

Al 0.2 А2 0.7 S3 0.015 S4 0.7

BI 08 В2

Рис. 7.32. Задача на оптимизацию сложного запроса с подзапросом

Так как коррелированное соединение относится к типу EXISTS, шаг 1 не применяется. Так как указатель стрелки посередине полусоединения указывает вверх, шаг 2 не применяется. Самый маленький (и единственный) корреляционный коэффициент предпочтения равен 1,5 (рядом с Е), поэтому шаг 3 не применяется. Выполняя шаг 4, находим, что наилучший ведущий узел во внешнем запросе — это М. Выполняя шаг 5, выбираем между соединениями вниз с Al и А2 с коэффициентами фильтрации 0,2 и 0,7, соответственно, и виртуальным соединением вниз с виртуальным узлом, представляющим полный подзапрос, с виртуальным коэффициентом фильтрации 0,6. Al — лучший из этих трех кандидатов, имеюший лучший коэффициент фильтрации, поэтому присоединяем его следующим. Так как от Al нет соединений вниз, следующим лучшим выбором в порядке соединения считаем подзапрос (опять применяя шаг 5), поэтому выполняем полусоединение с D.
Предыдущая << 1 .. 111 112 113 114 115 116 < 117 > 118 119 120 121 122 123 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100