Галерея
7757 8119 8300 8698 8817 9504 9722 9937
Интересные записи
Новое на сайте

Повышение эффективности многотабличных запросов

Повышение эффективности многотабличных запросовКаждая СУБД имеет собственный алгоритм преобразования запросов SQL в множество двоичных инструкций, которые далее интерпретируются механизмом СУБД для составления плана выполнения запроса. В этом плане определяются порядок объединения таблиц, применяемые условия предложения WHERE, состав используемых индексов и т. д. Эквивалентным запросом, в котором не использована корреляция, будет следующий.

Таким образом, практически всегда существует возможность избежать в инструкции SELECT коррелирующих подзапросов; инструкции UPDATE и DELETE при этом становятся значительно сложнее, особенно в Oracle и DB2. Microsoft SQL Server имеет в инструкциях UPDATE и DELETE специальное предложение FROM, что несколько упрощает задачу (см. главу 6). Порядок объединений и условия предложения WHERE могут серьезно повлиять на производительность запроса. Для примера предположим, что требуется объединить таблицы CUSTOMER и ORDER_HEADER, а затем извлечь все заказы компании FAIR PARK GARDENS. Совершенно очевидно, что выполнение запроса займет меньше времени, если вначале ограничить число рассматриваемых записей таблицы CUSTOMER (WHERE customer_cust_name_s = ‘FAIR PARK GARDENS’), а затем объединить результат с таблицей ORDER_HEADER. В этом случае объединение будет выполняться всего для одной строки. Окажутся полезными индексы по столбцам CUST_NAME_S, а также те, которые участвуют в объединении. Все современные СУБД имеют специальные механизмы, называемые Оптимизаторами. Они создают план выполнения запроса на основе информации, накопленной в информационной схеме. Теоретически это устраняет необходимость применения сложных правил построения запросов. Теперь программистам можно не уделять большого значения порядку перечисления таблиц и столбцов в предложениях FROM и WHERE инструкции SELECT с целью повышения производительности запросов — всю эту работу берет на себя оптимизатор. Слово “теоретически” в предыдущем абзаце было выделено не случайно. Иногда (особенно в сложных запросах, объединяющих большое число таблиц) оптимизатору не удается найти “оптимальный” способ синтаксического разбора запроса. В подобных ситуациях лучше давать в запросе подсказку оптимизатору (используя специфичный для конкретной СУБД набор ключевых слов), которая изменяет ход событий, определяемый оптимизатором, на тот, который строго задан программистом. В целом подсказки указывают СУБД, в каком порядке объединять таблицы, использовать индекс или выполнять полное сканирование таблицы и т. п.