Деактивация преобразования запросов Oracle - PullRequest
0 голосов
/ 19 апреля 2011

Иногда я схожу с ума по различным планам выполнения запросов в разработке, интеграционных тестах и ​​продуктивных системах.Помимо обычного анализа, который я выполняю, я просто хочу знать:

Можно ли деактивировать некоторые операции преобразования оптимизатора запросов на системном уровне (так же, как они могут быть деактивированы на уровне для каждого запроса с помощью подсказок)?

В этом случае я ожидаю, что операция UNION ALL PUSHED PREDICATE для запроса будет выглядеть примерно так:

SELECT ...
FROM (SELECT ... FROM A
      UNION ALL
      SELECT ... FROM B)
WHERE X = :B1

A и B - это представления, оба из которых выбираются изте же таблицы, содержащие X, где X - первичный ключ.Важно, что выбор для X передается в оба вида A и B перед извлечением всех данных A и B.И это также возможно, потому что никаких сложных преобразований не требуется.

Таким образом, кроме деактивированных индексов, неверной статистики, проблемы просмотра переменных при связывании и других обычных подозрений, существует вероятность того, что весь экземпляр Oracle может простоне делать одно или два преобразования, потому что они выключены?

Ответы [ 3 ]

2 голосов
/ 19 апреля 2011

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

Примеры можно найти в руководстве и здесь

Вы также можете заблокировать статистику в целевых средах после импорта, чтобы они не изменились.

2 голосов
/ 19 апреля 2011

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

Следующий запрос показывает все недокументированные параметры, по крайней мере, для 10g:

SELECT a.ksppinm "Parameter",
       b.ksppstvl "Session Value",
       c.ksppstvl "Instance Value"
  FROM x$ksppi a,
       inner join x$ksppc b
          on a.indx = b.indx
       inner join x$ksppsv c
          on a.indx = c.indx
 WHERE a.ksppinm LIKE '/_%' escape '/'
/

Аналогично, при установке события 10053 будет сгенерирован файл трассировки оптимизации, который покажет, какие параметры (задокументированы или нет) повлияли на генерацию плана запроса.

1 голос
/ 19 апреля 2011

Существует ряд параметров инициализации базы данных, которые могут включать или отключать различные параметры оптимизатора и различные преобразования запросов. Поэтому, если у вас разные параметры инициализации, установленные в разных средах, вы, безусловно, можете оказаться в ситуации, когда одна среда может выполнить конкретное преобразование, а другая - нет, несмотря на одинаковые структуры данных и статистику.

В случае с этим конкретным запросом я сразу же обращаюсь к параметру OPTIMIZER_SECURE_VIEW_MERGING. Это определенно может вызвать проблемы для этого конкретного типа конструкции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...