Вопрос

Для удовольствия я играю со встроенным оптимизатором для Oracle в Toad сегодня. Одна из оптимизаций, которые он предлагает, является следующим

AND emp.pay_type = NVL('FT', UID)

Вместо

AND emp.pay_type = 'FT'

Я запутался на том, что здесь происходит и из-за этого, смущено также, почему это улучшит производительность. Поскольку Ft - это строковая буквальная в пределах SQL-запроса и, следовательно, никогда не нулевой, почему это имеет значение? Я предполагаю, что это есть что связано с существующим индексом на поле, но не могу найти что-либо в документах Oracle.

Это было полезно?

Решение

Это странный совет. Функция NVL работает так:

NVL(exp1, val1)

Если «EXP1» не является нулевым, возвращается; В противном случае возвращается 'val1'.

Поскольку «Ft» в примере не может быть нулевым, нет никакой пользы для использования функции NVL и небольшой производительность штрафа (по крайней мере, для оптимизатора для работы, что NVL является избыточным; может быть, казнь исполнения, если оптимизатор не работает из того, что NVL избыточный).

Если условие чтение:

И EVP.PAY_TYPE = NVL («FT», UID)

тогда может быть выгода; Здесь у нас есть разделительный идентификатор (имя столбца, заключенное в двойные кавычки), и значение столбца, возможно, может быть нулевым; Вызов NVL гарантирует, что NULL возвращается только тогда, когда «FT» является NULL а также UID это ноль. UID, конечно, обычный идентификатор.

Это может иметь смысл, если условие чтение:

AND emp.pay_type = NVL(UID, 'FT')

Теперь, если значение UID равно NULL, то значение по умолчанию «Ft» используется в качестве соответствующего Pay_Type.

Другие советы

Я бы взял «Предложения оптимизации Toad» с огромными зернами соли. Я называю их методом оптимизации «дробовика» - застрелить много разных битов в цель и посмотреть, какой из них хитов, как-то :)

В любом случае, разница между

AND emp.pay_type = NVL('FT', UID)

а также

AND emp.pay_type = 'FT'

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

Это не метод оптимизации, который я обычно использовал. Есть лучшие способы контролировать путь выполнения запроса (например, подсказки). В частности, этот метод потерпит неудачу, если они улучшили CBO, чтобы искать и оптимизировать избыточный код, как NVL([literal value],[anything]) к [literal value].

Что планет Oracle объясняет вам о двух запросах?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top