Каковы типы и внутренняя работа оптимизатора запросов? - PullRequest
1 голос
/ 14 апреля 2010

Насколько я понимаю, большинство оптимизаторов запросов основаны на затратах. Другие «основаны на правилах», или я полагаю, они называют это «Синтаксические основы». Итак, каков наилучший способ оптимизировать синтаксис операторов SQL, чтобы помочь оптимизатору получить лучшие результаты?

На некоторые оптимизаторы, основанные на затратах, могут влиять такие «подсказки», как FIRST_ROWS (). Другие предназначены для OLAP. Можно ли узнать более подробную логику о том, как Informix IDS и оптимизаторы SE решают, какой маршрут лучше всего обрабатывать запрос, кроме SET EXPLAIN? Есть ли документация, иллюстрирующая ранжирование операторов SELECT относительно того, какой самый быстрый способ получить доступ к строкам при условии, что они проиндексированы?

Я бы предположил, что "SELECT col FROM table WHERE ROWID = n" является самым быстрым (ранг 1).

Если я не ошибаюсь, ROWID в Informix SE - это SERIAL (INT), который позволяет макс. 2GB Nrows, или, может быть, он использует INT9 для Nrows TB? Оптимизатор SE основан на затратах, когда в нем достаточно данных, но он не использует распределения, подобные оптимизатору IDS.

IDS'ROWID - это не INT, это логический адрес левой страницы строки сдвинуто 8 бит плюс номер слота на странице, содержащей данные строки.

Оптимизатор IDS - это оптимизатор на основе затрат, использующий данные о глубине и ширине индекса, количестве строк, количестве страниц и распределения данных, созданные обновлением статистики MEDIUM и HIGH, чтобы решить какой путь запроса наименее затратный, но нет ранжирования операторов?

Я думаю, что Oracle использует значения HEX для ROWID. Жаль, что ROWID не может часто использоваться, так как строки ROWID могут измениться. Поэтому, может быть, ROWID может использоваться оптимизатором в качестве счетчика для отчета о ходе выполнения запроса? Идея, которую я упомянул в своем вопросе «Начать просмотр результатов запроса до его завершения»? Я чувствую, что будет не так сложно сообщать о ходе выполнения запроса во время его обработки, возможно, за счет некоторой незначительной накладной нагрузки, но было бы неплохо знать заранее: "Google-подобная" оценка количества встречающихся строк критерии запроса, отображать его ход каждые 100, 200, 500 или 1000 строк, дают пользователям возможность отменить его в любое время и начать отображать соответствующие строки по мере их помещения в текущий список, пока он продолжает поиск? .. Это Это всего лишь один пример, возможно, мы могли бы подумать о других полезных / полезных функций, ингредиенты более или менее там.

Возможно, мы могли бы уточнить каждый запрос с большей детализацией, чем доступно в настоящее время? OLTP-запросы, как правило, в основном статические и предопределенные. «Что, если» больше OLAP, так что давайте попробуем добавить больше контроля и интеллекта к нему? Таким образом, для более точного управления, а не просто «подсказка / влияние» оптимизатор необходим. Тогда мы можем иметь более динамичные операторы SELECT для конкретных ситуаций! Может быть, даже попросить IDS читать блоки индексных узлов за раз вместо одного за другим и т. Д. И т. Д.

Ответы [ 2 ]

1 голос
/ 15 апреля 2010

Для Oracle ваш лучший ресурс будет Основы оракула на основе стоимости . Это около 500 страниц (и оплачивается как том 1, но пока еще не было никаких продолжений).

Для (очень) простого сканирования полной таблицы ход выполнения иногда можно отслеживать с помощью v $ session_longops. Oracle знает, сколько блоков нужно отсканировать, сколько блоков отсканировано, сколько нужно пройти, и сообщает о ходе выполнения.

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

Это становится еще сложнее, когда вы добавляете другие фильтры и обращаетесь к предикатам (например, когда можно выбрать несколько индексов), и делаете еще один скачок, когда вы включаете объединения таблиц. И это, не вдаваясь в сложные вещи об удаленных базах данных, доменных индексах, таких как Oracle Text и Locator.

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

Но я бы сказал, что вы идете не туда. Смысл СУБД состоит в том, чтобы абстрагировать детали так, чтобы, по большей части, они просто происходили. В Oracle работают умные люди, которые пишут информацию о преобразовании запросов в оптимизаторе, чтобы мы, разработчики, могли отойти от «игры с синтаксисом», чтобы получить лучшие планы (не полностью, но все лучше).

1 голос
/ 14 апреля 2010

Я не совсем уверен, что вы ищете, но вот некоторая информация об оптимизаторе запросов SQL Server, которую я недавно прочитал:

13 Что нужно знать о статистике и оптимизаторе запросов

Анализ плана выполнения запросов SQL Server

и один для Informix, который я только что нашел с помощью Google:
Часть 1: Настройка Informix SQL

...