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

 

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

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

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


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

Внешние соединения

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

SELECT ___ D.Department_Name FROM Employees E. Departments D

WHERE E.Oepartment_ID=D.Oepartment_ID(+):

В новом стиле записи в любой базе данных запрос будет выглядеть так:

SELECT ___ D.Department_Name

FROM Employees E
Соединения

61

LEFT OUTER JOIN Departments D ON E.Depa rtment_ID-D.Depa rtment_ID:

Эти запросы возвращают информацию обо всех сотрудниках, в том числе информацию об отделах, где те работают. Однако если для сотрудника нет соответствующего отдела, запрос все же возвращает данные сотрудника, причем в результирующих данных такие поля с ненайденными значениями, как D.Department_Name, заполняются значениями null. С точки зрения настройки главным результатом внешнего соединения является то, что оно запрещает путь выполнения, который на основе данных из подчиненной таблицы пытается получить записи основной таблицы. В нашем примере база данных не может начать с таблицы Departments и искать соответствующие строки в таблице Employees, так как базе данных нужны данные обо всех сотрудниках, а не только о тех, для которых указан отдел. Позже я покажу, что это ограничение порядка соединения во внешних соединениях не всегда имеет большое значение, поскольку чаще всего нет необходимости проводить соединение в запрещенном порядке.

Способы обработки соединений

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

Соединения при помощи вложенных циклов

Самый простой способ эффективного выполнения соединения двух и более таблиц — это соединение при помощи вложенных циклов, показанное на рис. 2.7.

Перввя твблица, Вторая таблица,

с которой производится с которой производится Ведущвя таблице соединение соединение

Рис. 2.7. Соединения методом вложенных циклов

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

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

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

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

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