2010-04-14 5 views
1

Насколько я понимаю, большинство оптимизаторов запросов «основаны на затратах». Другие «основаны на правилах», или я считаю, что они называют это «Основанный на синтаксисе». Итак, что лучше всего оптимизировать синтаксис операторов 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 для TB? Оптимизатор SE основан на стоимости, когда он имеет достаточно данных, но не использует такие дистрибутивы, как оптимизатор IDS.

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

оптимизатор IDS»является стоимость оптимизатор, который использует данные о глубине индекса и ширины, количество строк, количество страниц и распределения данных созданы обновление статистики среднего и высокого уровня, чтобы решить , какой путь запроса наименее дорогой, но нет ранжирования заявлений?

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

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

+0

В одном вопросе много вопросов - для коммерческих продуктов внутренняя работа оптимизаторов запросов остается внутренней информацией, поскольку она является частью IP-адреса продукта. – Andrew

ответ

1

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

13 Things You Should Know About Statistics and the Query Optimizer

SQL Server Query Execution Plan Analysis

и один для Informix, что я только что нашел с помощью Google:
Part 1: Tuning Informix SQL

+0

@KM - Я уточнил и добавил дополнительную информацию. Возможно, теперь вы можете лучше понять то, что я ищу. –

1

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

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

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

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

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

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

Смежные вопросы