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

 

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

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

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 26 27 28 29 30 31 < 32 > 33 34 35 36 37 38 .. 161 >> Следующая


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

Говоря о надежности, я имею в виду исключительно метод соединения. Независимо от соединения, запросу может потребоваться объемный отсортированный результирующий набор (например, если присутствует фраза ORDER BY), для получения которого необходимо много памяти и дискового пространства.

Соединения хэшированием

Иногда база данных должна обратиться к соединяемым таблицам по отдельности, а затем соединить соответствующие строки и отбросить ненужные. Можно сделать это двумя способами: соединением хэшированием, которое рассматривается
Соединения

63

в этом разделе, и соединением с сортировкой слиянием, которому посвящен следующий раздел. На рис. 2.8 показано соединение хэшированием.

Небольшой Основной

набор строк набор строк

‘Обычно в памяти

Рис. 2.8. Соединение хэшированием

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

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

Обратите внимания, что соответствие может быть и не найдено. Когда база данных находит соответствие (на рисунке это показано ящиком внизу в середине),

1 Синтаксический оптимизатор Oracle никогда не выберет слияние хэшированием, но стоимостной оптимизатор часто делает это. Другие поставщики баз данных не используют синтаксические оптимизаторы.
64

2. Основы доступа к данным

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

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

Соединения с сортировкой слиянием

При соединении с сортировкой слиянием, показанном на рис. 2.9, обе таблицы считываются независимо, но вместо того, чтобы находить соответствующие строки хэшированием, оба набора строк предварительно сортируются по ключу соединения и затем объединяются. В самой простой реализации можно представить, что наборы строк отсортированы и записаны рядом друг с другом. База данных попеременно идет вниз по обоим спискам, проходя каждый список один раз, на каждом шаге сравнивая верхние строки, отбрасывая те, которые находятся раньше (в порядке сортировки), чем верхняя строка другого списка, и возвращая подходящие друг другу строки. Если оба списка отсортированы, то процесс поиска соответствий проходит быстро, но предварительная сортировка дорога и ненадежна, если только вы не можете гарантировать, что оба набора строк настолько малы, что могут целиком поместиться в памяти.

Основной Присоединяемый

набор строк набор строк

Рис. 2.9. Соединение с сортировкой слиянием
Соединения

65

Если сравнивать соединение с сортировкой слиянием и соединение методом вложенных циклов, то у первого варианта практически те же потенциальные преимущества, которые бывают у соединения хэшированием. Однако если сравнить соединение с сортировкой слиянием и соединение хэшированием, то у второго варианта будут серьезные преимущества. Он не помещает большие наборы строк в память или на диск и практически не увеличивает стоимость. Таким образом, если вам надо выбрать между соединением с сортировкой слиянием и соединением хэшированием, никогда не выбирайте соединение сортировкой слиянием.
Предыдущая << 1 .. 26 27 28 29 30 31 < 32 > 33 34 35 36 37 38 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100