Существуют ли какие-либо наборы инструментов / методы, чтобы определить, являются ли запросы SQL функционально идентичными? - PullRequest
2 голосов
/ 11 октября 2010

От клиента я получаю запросы SQL, которые содержат все виды избыточных вложенных элементов, сгенерированных компоновщиком в MS Access.Я конвертирую SQL в Postgres, и он работает - но я знаю, что он безнадежно неэффективен.Итак, я приступил к оптимизации запроса и произвел итеративные улучшения - и чтобы определить, является ли каждый новый запрос функционально идентичным, я запускаю его и проверяю, что он выдает одинаковый набор результатов.% эффективен при определении того, совпадает ли один запрос с другим - он опирается на данные, исследуемые в каждом отдельном случае.Коллега предлагает мне выполнить план объяснения для каждого запроса, но признает, что внутренний оптимизатор БД может использовать другую стратегию запросов, даже если новый запрос функционально идентичен (и это хорошо - новая стратегия может быть намного более эффективной).

У меня есть хотя бы средний уровень владения SQL, но я не уверен в оптимизаторе запросов.Таким образом, я был бы заинтересован в любом наборе инструментов для Postgres, который может со 100% уверенностью сказать, что два запроса делают одно и то же.Еще лучше, если он сам может предложить оптимизацию!Я верю, что TOAD может сделать это, но я не верю, что это доступно для Postgres.Я на Mac OS X.

Ответы [ 5 ]

2 голосов
/ 13 октября 2010

Отличный вопрос.Высокий ордер.

Как вы знаете, уровень логически идентичен.Кроме того, существует уровень генерации идентичных планов в зависимости от того, какой доступ к таблице требуется и в каком порядке.

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

Если ваш вопрос ограничен «идентичным выполнением для одного и того же набора данных», то сравнения планов EXPLAIN будет достаточно, и он будет включать как логическую идентичность, так и некоторый уровень ввода-выводаidenticality.

1 голос
/ 13 октября 2010

Обновление до PostgreSQL 9.0 или новее.

Из 9.0 заметки о выпуске :

  • Многочисленные улучшения производительности для определенных типов запросов, включая устранение ненужных объединений . Это помогает оптимизировать некоторые автоматически сгенерированные запросы , например, те, которые создаются объектно-реляционными сопоставителями (ORM).
1 голос
/ 12 октября 2010

Если вы улучшаете запрос PostgreSQL, который, конечно, уже написан для PostgreSQL, используйте pgTap (модульное тестирование для PostgreSQL), в этом нет сомнений.Вы можете проверить, как долго выполняется запрос и результаты, которые он возвращает среди прочего.http://pgtap.org/

1 голос
/ 11 октября 2010

Вы можете попробовать использовать TOAD на MySQL для анализа запроса.Как только вы улучшите запрос, перенесите его на PostgreSQL.

0 голосов
/ 11 октября 2010

Я бы сказал нет. Однако запросы от доступа не должны работать хуже в postgres при наличии надлежащих индексов.

Вы можете воспринимать запросы медленнее, поскольку msaccess обычно возвращает частичные результаты и только при просмотре набора данных продолжает выполнять запрос, при котором postgres обычно выполняет весь запрос (в зависимости, конечно, от используемого клиента).

...