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

 

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

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

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 74 75 76 77 78 79 < 80 > 81 82 83 84 85 86 .. 161 >> Следующая


¦ Как соединяются таблицы в плане выполнения?

¦ В каком порядке соединяются таблицы в плане выполнения?

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

Надежные планы выполнения

Некоторое подмножество всех возможных планов выполнения можно описать как надежные. Хотя такие планы могут быть не всегда близки к оптимальным, в реальных запросах они все же практически оптимальны и обладают хорошими характеристиками, такими, как предсказуемость и низкая вероятность появления ошибок во время выполнения. Ненадежное соединение может полностью выйти из строя с ошибкой «недостаточно доступного пространства», если для соединения хэшированием или сортировкой слиянием потребуется больше места на диске, чем доступно. Надежные планы хорошо работают на широком диапазоне возможных рас-
158

6. Выбор наилучшего плана выполнения

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

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

Неточности и ошибки неизбежны при решении проблемы оптимизации. Например, даже имея прекрасную информацию на время разбора (когда база данных создает план выполнения), условие наподобие Last_Name = : LName обладает неточной селективностью, зависящей от реального значения, которое во время выполнения будет привязано к параметру : LName. Неизбежность появления неточностей и ошибок делает надежность планов выполнения особенно важной.

Надежные планы выполнения обычно обладают несколькими свойствами.

¦ Их стоимость выполнения пропорциональна количеству возвращенных строк.

¦ Им практически не требуется пространство в памяти для сортировки или хэширования.

¦ Они не требуют изменений по мере увеличения размеров таблиц.

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

¦ Они особенно хороши, когда оказывается, что запрос возвращает меньше строк, чем вы ожидали (когда фильтры более селективны, чем кажется).

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

В каком-то смысле надежный план выполнения всегда оптимистичен. Он предполагает, что вы разработали приложение для обработки сравнительно небольшого количества строк, даже когда непонятно,

как именно запрос умудряется уменьшить набор строк до такого малого количества.

Требование надежности описывается несколькими условиями.

¦ Обращаться к первой таблице через селективный индекс.

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

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

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

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

159

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

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

Если вы используете только надежные планы, то правила надежности сами отвечают на первые два вопроса поиска наилучшего плана выполнения, оставляя открытым только вопрос о порядке соединения. Обычно возникает только два варианта.
Предыдущая << 1 .. 74 75 76 77 78 79 < 80 > 81 82 83 84 85 86 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100