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

 

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

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

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


Таким образом, если в запросе DB2 вы находите условие IS NULL для индексированного столбца, нужно предотвратить использование индекса. Простейшее эквивалентное условие, запрещающее использовать индекс, — это COALESCEC Indexed_Col umn. Indexed_Column) IS NULL. Этот вариант полностью эквивалентен исходному условию Indexed_Col umn IS NULL, но функция C0ALESCE() не позволяет использовать индекс.

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

Установка внутренних соединений на первое место в разделе FROM

Эта техника заключается в простом перечислении внутренних соединений на первых местах в разделе FROM. Он никогда не повредит запросу, и в старых версиях DB2 при помощи такой техники я получал существенно улучшенные планы выполнения.

Предотвращение одновременного разбора слишком большого количества внешних соединений

В старых версиях DB2 разбор запросов, содержащих более 12 внешних соединений, может занять минуты, и даже после может быть выдана ошибка. К счастью,
124

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

для этой проблемы существует решение — в SQL нужно использовать шаблон, приведенный ниже. В решении используется синтаксис вложенных таблиц DB2. В разделе FROM внешнего запроса содержится другой запрос, который с точки зрения внешнего запроса обрабатывается как одна таблица:

SELECT ...

FROM (SELECT ...

FROM (SELECT ... FROM <все внутренние соединения и десять внешних соединений WHERE <условия. относящиеся к максимально вложенной таблице >) Tl LEFT OUTER JOIN <внешние соединения с 11-го по 20-е>

WHERE <условия. если таковые существуют, относящиеся

к этой вложенной таблице, находящейся на самом внешнем уровне>) Т2 LEFT OUTER JOIN <остальные внешние соединения (максимум IOP WHERE <условия. если таковые существуют, относящиеся к внешнему запросу*

Этот шаблон подходит для запроса с 21-30 таблицами с внешними соединениями. Если внешними соединениями соединяются 11-20 таблиц, вам понадобится только одна вложенная таблица. Если таблиц больше 30, то потребуется больший уровень вложенности. Для такого синтаксиса DB2 эффективно создает вложенные представления «на лету», как определено запросами внутри круглых скобок в разделах FROM. Для успешной обработки внешних соединений DB2 обрабатывает все небольшие запросы независимо, уходя от проблемы слишком большого количества внешних соединений в одном запросе.

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

На предыдущем месте работы, в TenFold, мы обнаружили, насколько полезна эта техника, расширили продукт EnterpriseTenFold1 чтобы при необходимости он автоматически генерировал этот исключительно сложный SQL-код. Вероятно, это не самое простое решение для кода, написанного вручную, но все равно этот метод вполне может быть единственным эффективно работающим решением для случая с медленным или слишком сложным разбором множества внешних соединений в DB2.

Как принудить DB2 оптимизировать стоимость считывания первых строк

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

Чтобы быстро считать первые строки, обычно при помощи вложенных циклов, нужно добавить фразу OPTIMIZE FOR <л> ROWS (или OPTIMIZE FOR I ROW), где <n> — это количество строк, которые вы хотите получить быстрее, из большого набора строк, который теоретически вернет запрос. Этот оператор находится в самом конце запроса и сообщает DB2, что необходимо оптимизировать стоимость возвращения только первых <п> строк, не обращая внимания на стоимость выполнения оставшейся части запроса. Если вы точно знаете, сколько строк хотите получить, и доверяете оптимизатору выбор наилучшего плана, то можете выбрать <л>, исходя из этих начальных условий. Если вы хотите заставить надежный план со вложенными циклами начать выполняться как можно скорее, используйте OPTIMIZE FOR I ROW.
Управление планами в SQL Server

125

На практике этот метод обычно приводит к использованию соединений со вложенными циклами, так как в этом случае для начала соединения не требуется считывать наборы строк полностью. Однако явно указанное выражение ORDER BV может свести на нет любую попытку быстро получить первые строки. Она обычно требует сортировки, которая выполняется после завершения запроса, откладывая возвращение первой строки независимо от плана выполнения. Если вы хотите использовать соединения с вложенными циклами, применяя эту технику, то можно удалить условие сортировки и произвести сортировку в приложении. Подсказка OPTIMIZE FOR I ROW эквивалентна подсказке FIRST_ROWS в Oracle и подсказке 0PTI0N(FAST 1) в SQL Server.

В DB2 мало методов, которые помогают использовать точно выбранные планы выполнения, в противоположность огромному количеству подробностей, которые DB2 предлагает для уже существующего плана выполнения, объясняя, почему был выбран именно он. Ho я должен признаться, что доступные техники в сочетании с хорошим оптимизатором DB2 на моей практике проявляли себя замечательным образом.
Предыдущая << 1 .. 57 58 59 60 61 62 < 63 > 64 65 66 67 68 69 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100