Главная страница
Навигация по странице:

  • Вопросы оптимизации

  • Основные операции плана выполнения SQL Server

  • Filter Оператор просматривает входные данные и возвращает только те строки, которые удовлетворяют критерию фильтрации (предикату).Описание операций плана

  • Merge Join Соединение слиянием объединяет два отсортированных списка. Обе стороны объединения должны быть предварительно отсортированы.Nested Loops

  • Sort Сортирует набор по столбцам, указанным в Sort Key. Операция сортировки требует больших объемов памяти для материализации промежуточного результата.Aggregate

  • GroupAggregate Группирует предварительно отсортированный набор в соответствии с предложением GROUP BY. Эта операция не буферизует промежуточный результат.HashAggregate

  • Filter Применяет фильтр к набору строк.Limit Прерывает выполение операций, когда было выбрано нужное количество строк.Append

  • CTE Scan Схожа с Materialize. Операция запускает часть запроса и сохраняет ее вывод, чтобы он мог быть использован другой частью (или частями) запроса.SubPlan

  • Subquery Scan Операция означает подзапрос, входящий в UNION.Описание операций плана выполнения в Oracle

  • лекция. Учебник по sql если вы хотите узнать, что такое sql этот сайт для вас


    Скачать 7.88 Mb.
    НазваниеУчебник по sql если вы хотите узнать, что такое sql этот сайт для вас
    Анкорлекция
    Дата21.12.2022
    Размер7.88 Mb.
    Формат файлаpdf
    Имя файлаMoiseenko_SQL.pdf
    ТипУчебник
    #857633
    страница42 из 47
    1   ...   39   40   41   42   43   44   45   46   47
    Oracle не поддерживает
    INFORMATION_SCHEMA.
    Справедливости ради следует сказать, что Oracle предоставляет возможность использовать системные представления вместо непосредственного обращения к системным таблицам, что также позволяет безопасно изменять структуру системных таблиц.
    Приведем ряд типичных запросов в стандартном варианте и для Oracle.
    1. Список таблиц базы данных
    (текущей)
    Стандартное
    1.
    SELECT
    table_name
    FROM
    information_schema.
    TABLES
    ;
    Oracle
    1.
    SELECT
    table_name
    FROM
    all_tables
    WHERE
    owner=
    'ИМЯ
    СХЕМЫ'
    ;

    2. Список столбцов заданной таблицы (например, PC)
    Стандартное
    1.
    SELECT
    column_name
    FROM
    information_schema.
    COLUMNS
    WHERE
    table_name=
    'PC'
    ;
    Oracle
    1.
    SELECT
    column_name
    FROM
    all_tab_columns
    WHERE
    table_name=
    'PC'
    ;
    3. Тип данных и размер заданного символьного столбца таблицы (столбец
    model таблицы PC)
    Стандартное
    1.
    SELECT
    column_name, data_type, CHARACTER_MAXIMUM_LENGTH
    2.
    FROM
    information_schema.
    COLUMNS
    WHERE
    table_name=
    'PC'
    AND
    column_name =
    'model'
    ;
    Oracle
    1.
    SELECT
    column_name,data_type,data_length
    FROM
    all_tab_columns
    2.
    WHERE
    table_name=
    'PC'
    AND
    column_name=
    'MODEL'
    ;
    4. Имя ограничения первичного ключа таблицы PC
    Стандартное
    1.
    SELECT
    table_name,constraint_name
    FROM
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    2.
    WHERE
    table_name=
    'PC'
    AND
    CONSTRAINT_TYPE=
    'Primary key'
    ;
    Oracle
    1.
    SELECT
    table_name,constraint_name
    FROM
    all_constraints
    2.
    WHERE
    table_name=
    'PC'
    AND
    constraint_type=
    'P'
    ;

    5. Список столбцов, составляющих первичный ключ таблицы Utb
    Стандартное
    1.
    SELECT
    table_name, column_name
    2.
    FROM
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
    WHERE
    table_name=
    'utb'
    3.
    AND
    constraint_name=
    (
    SELECT
    constraint_name
    FROM
    INFORMATION_SCHEMA.table_constraints
    4.
    WHERE
    table_name=
    'utb'
    AND
    CONSTRAINT_TYPE=
    'Primary key'
    )
    ;
    Здесь мы в основном запросе получаем столбцы, участвующие в ограничениях, и выбираем те из них, у которых имя ограничения совпадает с именем ограничения первичного ключа для той же таблицы. В принципе, условие table_name='utb' основного запроса является избыточным с точки зрения получения правильного ответа, поскольку имя ограничения является уникальным для всей базы. Однако ранняя фильтрация существенно ускоряет выполнение запроса.
    Оракл
    1.
    SELECT
    table_name, column_name
    FROM
    all_ind_columns
    WHERE
    table_name=
    'UTB'
    2.
    AND
    index_name=
    (
    SELECT
    constraint_name
    FROM
    all_constraints
    3.
    WHERE
    table_name=
    'UTB'
    AND
    constraint_type=
    'P'
    )
    ;
    Вопросы
    оптимизации
    Настройка производительности
    СУБД
    - многоуровневый процесс, и оптимизация запросов является лишь одним из его аспектов.

    Под оптимизацией запроса понимаются действия, приводящие к тому, что оптимизатор запросов выбирает наилучший процедурный план его выполнения. Зачастую это сводится к созданию или перестройке соответствующих индексов, обновлению статистики и т.д., т.е. действиям, не приводящим к переписыванию самого запроса.
    Чтобы выполнять такого рода оптимизацию, необходимо умение читать план выполнения запроса и понимать, как выполняются физические операторы, фигурирующие в плане. Этим вопросам посвящены статьи и переводы, которые публикуются в блогах на sql-ex.ru
    Здесь же мы будем рассматривать несколько иные вопросы, которые более соответствуют тематике настоящего учебника. Эти вопросы связаны с тем, что одну и ту же практическую задачу можно решить по разному, т.е. использовать различные алгоритмы, реализованные затем в SQL. Грубо говоря, можно так написать запрос, что никакая оптимизация не повысит его производительности до требуемого уровня.
    Многочисленные примеры сказанного вы можете найти на форумах sql-ex.ru, где публикуются разнообразные решения одной и той же задачи. А имеющийся на сайте оптимизационный этап непосредственно связан с написанием производительных запросов.
    Основные
    операции
    плана
    выполнения
    SQL Server

    Данная статья представляет собой описание основных операций, отображаемых в планах выполнения запросов
    СУБД MS SQL Server.
    Index Seek
    Поиск по некластеризованному индексу.
    В большинстве случаев является хорошим для производительности, так как представляет собой прямой доступ SQL Server к требуемым строкам данных. Однако это вовсе не означает, что он всегда работает быстро, например, если он возвращает большое число строк, то по производительности он будет практически равен Index Scan.
    Подробнее...
    Index Scan
    Сканирование некластеризованного индекса. Обычно наличие этой операции плохо отражается на производительности, поскольку она предполагает последовательное чтение индекса для извлечения большого числа строк, приводя к более медленной обработке. Но бывают исключения, например, применение директивы TOP, ограничивающей число возвращаемых записей; если возвращать всего несколько строк, то операция сканирования будет выполняться достаточно быстро, и вы не сможете получить лучшую производительность, чем ту, которую уже имеете, даже если вы попытаетесь перестроить запрос/индексы, чтобы добиться операции Index Seek.
    Подробнее...
    RID Lookup
    Поиск идентификатора записи, является узким местом производительности запроса. Но это легко исправить: если вы видите этот оператор, это означает, что у вас отсутствует кластеризованный индекс на таблице. По крайней мере, вы должны добавить кластеризованный индекс, и тут же получите некоторый рост производительности для большинства ваших запросов.

    Подробнее...
    Key Lookup
    Поиск ключей. Возникает, когда SQL Server предполагает, что он с большей эффективностью может использовать некластеризованный индекс, а затем перейти к кластерзованному индексу для поиска оставшихся значения строк, которые отсутствуют в некластеризованном индексе. Это не всегда плохо: обращение SQL Server к кластеризованному индексу для извлечения недостающих значений довольно эффективный метод по сравнению с необходимостью создавать и поддерживать совершенно новые индексы.
    Однако, если все, что нужно SQL Server от операции
    Key Lookup, это единственный столбец данных, гораздо проще добавить этот столбец в ваш существующий некластеризованный индекс.
    Размер индекса увеличится на один столбец, но SQL Server сможет избежать необходимости обращаться к двум индексам для извлечения всех необходимых данных и это в целом окажется более эффективным решением.
    Подробнее...
    Sort
    Сортировка является одной из наиболее дорогих операций, которые могут быть в плане выполнения, поэтому лучше избегать ее, насколько это возможно.
    Простой способ избежать оператора сортировки – иметь данные, хранящиеся в предварительно упорядоченном виде. Это может быть выполнено созданием индекса с ключевыми столбцами, перечисленными в том же самом порядке, который использует оператор сортировки.
    Если SQL Server должен выполнить сортировку одних и тех же данных в одном и том же порядке несколько раз в плане выполнения, то еще одним выходом является разбиение запроса на несколько этапов при использовании временных индексированных таблиц для сохранения данных между этапами. В таком случае,
    если вы будете повторно использовать временную таблицу в плане выполнения вашего запроса, то вы получите чистую экономию.
    Подробнее...
    Spool
    Спулы бывают разных типов, но большинство из них можно сформулировать как операторы, которые сохраняют промежуточную таблицу результатов в tempdb.
    SQL Server часто использует спул для обработки сложных запросов, преобразуя данные во временную таблицу в базе tempdb для использования её данных в последующих операциях. Побочным эффектом здесь является необходимость записи данных на диск.
    Для ускорения выполнения запроса можно попытаться найти способ его перезаписи таким образом, чтобы избежать спула. Если это не получается, использую метод "разделяй и властвуй" для временных таблиц, который может также заменить спул, обеспечивая больший контроль по сравнению с тем, как SQL Server записывает и индексирует данные в tempdb.
    Подробнее...
    Merge Join
    Соединение слиянием. Редко встречаются в реальных запросах, как правило, являются наиболее эффективными из операторов логического соединения.
    Оптимизатор выбирает использование соединение слиянием, когда входные данные уже отсортированы или SQL Server может выполнить сортировку данных с относительно небольшой стоимостью.
    Операция неприменима, если входные данные не отсортированы.
    Подробнее...

    Nested Loops Join
    Соединение вложенными циклами. Встречаются очень часто. Выполняют довольно эффективное соединение относительно небольших наборов данных.
    Соединение вложенными циклами не требует сортировки входных данных.
    Однако производительность можно улучшить при помощи сортировки источника входных данных; SQL Server сможет выбрать более эффективный оператор, если оба входа отсортированы.
    Операция неприменима, если данные слишком велики для хранения в памяти.
    Подробнее...
    Hash Match Join
    Операция используется всегда, когда невозможно применить другие виды соединения. Она выбираются оптимизатором запросов по одной из двух причин:
    1. Соединяемые наборы данных настолько велики, что они могут быть обработаны только с помощью Hash Match Join.
    2. Наборы данных не упорядочены по столбцам соединения, и SQL Server думает, что вычисление хэшей и цикл по ним будет быстрей, чем сортировка данных.
    При первом сценарии трудно оптимизировать выполнение запроса, если только не найти способа соединять меньшие объемы данных.
    При втором же сценарии, если есть некоторый способ получить данные в упорядоченном виде до соединения, типа предопределенного порядка сортировки в индексе, то возможно, что SQL Server выберет вместо этой операции более быстрый алгоритм соединения.
    Операторы Hash Match Join достаточно эффективны тогда, когда не сбрасывают данные в tempdb.

    Подробнее...
    Parallelism
    Операторы параллелизма обычно считаются хорошими вещами: SQL Server дробит ваши данные на множество частей для асинхронной обработки на множестве процессоров, сокращая общее время работы, требуемое для выполнения вашего запроса.
    Однако параллелизм может стать плохим, если большинство запросов используют его.
    При параллелизме процессоры по-прежнему выполняют тот же самый объем работы, что и без него, тем самым отнимая ресурсы у других запросов, которые могут быть запущены, плюс накладывается дополнительная нагрузка на SQL Server по дроблению и последующему объединению всех данных из множества нитей выполнения.
    Если параллелизм является узким местом производительности, можно рассмотреть вопрос об изменении порогового значения стоимости для настройки параллелизма, если оно установлено слишком низким.
    Подробнее...
    Stream Aggregate
    Статистическое выражение потока. Группирует строки в один или несколько столбцов и вычисляет одно или несколько агрегатных выражений (пример: COUNT,
    MIN, MAX, SUM и AVG), возвращенных запросом.
    Выход этого оператора может быть использован последующими операторами запроса, возвращен клиенту или то и другое. Оператору Stream Aggregate необходимы входные данные, упорядоченные по группируемым столбцам. Оптимизатор использует перед этим оператором оператор Sort, если данные не были ранее отсортированы оператором Sort или используется упорядоченный поиск или просмотр в индексе.

    Compute Scalar
    Оператор Compute Scalar вычисляет выражение и выдает вычисляемую скалярную величину. Затем эту величину можно вернуть пользователю или сослаться на нее в каком-либо запросе, а также выполнить эти действия одновременно. Примерами одновременного использования этих возможностей являются предикаты фильтра или соединения. Всегда возвращает одну строку. Часто применяется для того, чтобы конвертировать результат
    Stream
    Aggregate в ожидаемый на выходе тип int (когда Stream Aggregate возвращает bigint в случае с COUNT, AVG при типах столбцов int).
    Concatenation
    Оператор просматривает несколько входов, возвращая каждую просмотренную строку. Используется в запросах с UNION ALL. Копирует строки из первого входного потока в выходной поток и повторяет эту операцию для каждого дополнительного входного потока.
    Filter
    Оператор просматривает входные данные и возвращает только те строки, которые удовлетворяют критерию фильтрации (предикату).
    Описание
    операций
    плана
    выполнения
    в Postgresql
    Данная статья представляет собой описание основных операций, отображаемых в планах выполнения запросов
    СУБД PostgreSQL.

    Seq Scan
    Операция сканирует всю таблицу в порядке, в котором она хранится на диске. Обычно наличие этой операции плохо отражается на производительности, поскольку она предполагает последовательное чтение для извлечения большого числа строк, приводя к более медленной обработке. Но бывают исключения, например, применение директивы
    Limit, ограничивающей число возвращаемых записей.
    Index Scan
    Сканирование индекса выполняет обход индекса, просматривает конечные узлы, чтобы найти все соответствующие записи, и извлекает соответствующие данные из таблицы. В большинстве случаев является хорошей для производительности, так как представляет собой прямой доступ к требуемым строкам данных.
    Bitmap Index Scan
    В то время как Index Scan извлекает один указатель кортежа за раз из индекса и немедленно переходит к этому кортежу в таблице, Bitmap Index Scan извлекает все указатели кортежей из индекса за один раз, сортирует их, используя структуру данных "битовая карта (bitmap)" в оперативной памяти, а затем просматривает кортежи таблиц в порядке физического расположения кортежей.
    Merge Join
    Соединение слиянием объединяет два отсортированных списка. Обе стороны объединения должны быть предварительно отсортированы.
    Nested Loops
    Соединение вложенными циклами объединяет две таблицы, выбирая результат из одной таблицы и запрашивая другую таблицу для каждой строки из первой. Встречается очень часто. Выполняет довольно эффективное соединение относительно небольших
    наборов данных. Соединение вложенными циклами не требует сортировки входных данных.
    Hash Join
    Хеш-соединение загружает записи-кандидаты с одной стороны соединения в хеш-таблицу, которая затем проверяется для каждой строки с другой стороны соединения. Операция используется всегда, когда невозможно применить другие виды соединения: если соединяемые наборы данных достаточно велики и/или наборы данных не упорядочены по столбцам соединения.
    Sort
    Сортирует набор по столбцам, указанным в Sort Key.
    Операция сортировки требует больших объемов памяти для материализации промежуточного результата.
    Aggregate
    Появляется в плане, если в запросе есть агрегатная функция, используемая для вычисления отдельных результатов из нескольких входных строк: COUNT,
    SUM, AVG, MAX, MIN и прочие.
    GroupAggregate
    Группирует предварительно отсортированный набор в соответствии с предложением GROUP BY. Эта операция не буферизует промежуточный результат.
    HashAggregate
    Использует временную хэш-таблицу для группировки записей.
    Операция
    HashAggregate не требует предварительно отсортированного набора данных, вместо этого она использует большие объемы памяти для материализации промежуточного результата. Вывод не упорядочен каким-либо значимым образом.

    Unique
    Удаляет дублирующиеся данные. Практически не требует памяти: сравнивает значение в предыдущей строке с текущим и, если они одинаковые, отбрасывает его.
    Данные должны быть предварительно отсортированны.
    Filter
    Применяет фильтр к набору строк.
    Limit
    Прерывает выполение операций, когда было выбрано нужное количество строк.
    Append
    Запускает множество субопераций и возвращает все возвращенные ими строки в виде общего результата.
    Используется в запросах, содержащих UNION или
    UNION ALL.
    HashSetOp
    Операция используется операциями INTERSECT и
    EXCEPT (с опциональным модификатором ALL). Она работает следующим образом: запускает субоперации
    Append для пары подзапросов, а затем, на основании результата и опционального модификатора ALL, решает, какие строки нужно вернуть.
    Materialize
    Операция получает данные из нижележащей операции и размещает их в памяти (или частично в памяти), чтобы ими можно было быстрее воспользоваться, или добавляет им дополнительные свойства, которые предыдущая операция не предоставляет.
    CTE Scan

    Схожа с Materialize. Операция запускает часть запроса и сохраняет ее вывод, чтобы он мог быть использован другой частью (или частями) запроса.
    SubPlan
    Операция означает подзапрос, в котором есть ссылки на основной запрос. Вызывается, чтобы посчитать данные из подзапроса, которые зависят от текущей строки.
    InitPlan
    Операция означает подзапрос, у которого нет ссылок на основной запрос. Операция появляется в плане, когда есть часть запроса, которую можно (или нужно) вычислить прежде всего, и она не зависит ни от чего в остальной части запроса.
    Subquery Scan
    Операция означает подзапрос, входящий в UNION.
    Описание
    операций
    плана
    выполнения
    в Oracle
    Данная статья представляет собой описание основных операций, отображаемых в планах выполнения запросов
    СУБД Oracle RDBMS.
    Index Unique Scan
    Выполняет только обход B-дерева. Эта операция используется, если уникальное ограничение гарантирует, что критерии поиска будут соответствовать не более чем одной записи.

    1   ...   39   40   41   42   43   44   45   46   47


    написать администратору сайта