Использование EXPLAIN PLAN

5 Использование EXPLAIN PLAN.

В этой главе представлены планы выполнения, описывается оператор SQL EXPLAIN PLAN и объясняется, как интерпретировать его вывод. В этой главе также обсуждаются функции стабильности плана и использование сохраненных схем, чтобы сохранить ваши вложения в настройку для определенных операторов SQL. В этой главе описаны процедуры управления схемами для контроля характеристик производительности приложений..

Эта глава состоит из следующих разделов:

Синтаксис EXPLAIN PLAN см. В Oracle8i SQL Reference..

Понимание EXPLAIN PLAN.

Оператор EXPLAIN PLAN отображает планы выполнения, выбранные оптимизатором Oracle для операторов SELECT, UPDATE, INSERT и DELETE. План выполнения оператора — это последовательность операций, которые Oracle выполняет для выполнения оператора. Компоненты планов выполнения включают:

Использование EXPLAIN PLAN plan

Порядок таблиц, упомянутых в заявлении.

Метод доступа к каждой таблице, упомянутой в заявлении..

Метод соединения для таблиц, затронутых операциями соединения в операторе.

Вывод EXPLAIN PLAN показывает, как Oracle выполняет операторы SQL. Однако одни только результаты EXPLAIN PLAN не могут отличить хорошо настроенные утверждения от тех, которые работают плохо. Например, если выходные данные EXPLAIN PLAN показывают, что оператор использует индекс, это не означает, что оператор выполняется эффективно. Иногда использование индексов может быть крайне неэффективным. Лучше всего использовать EXPLAIN PLAN для определения плана доступа, а затем доказать его оптимальность путем тестирования..

При оценке плана всегда проверяйте фактическое потребление ресурсов утверждением. Для достижения наилучших результатов используйте Oracle Trace или средство трассировки SQL и TKPROF для проверки производительности отдельных операторов SQL..

Создание выходной таблицы.

Перед выполнением оператора EXPLAIN PLAN создайте таблицу для хранения его вывода. Используйте один из следующих подходов:

Запустите сценарий SQL UTLXPLAN. SQL для создания в вашей схеме образца выходной таблицы с именем PLAN_TABLE. Точное имя и расположение этого скрипта зависит от вашей операционной системы. Например, в Sun Solaris файл UTLXPLAN. SQL находится в $ ORACLE_HOME / rdbms / admin. PLAN_TABLE — это таблица по умолчанию, в которую оператор EXPLAIN PLAN вставляет строки, описывающие планы выполнения..

Выполните оператор CREATE TABLE, чтобы создать выходную таблицу с любым именем, которое вы выберете. Когда вы запускаете оператор EXPLAIN PLAN, вы можете направить его вывод в эту таблицу..

Любая таблица, используемая для хранения вывода оператора EXPLAIN PLAN, должна иметь те же имена столбцов и типы данных, что и PLAN_TABLE:

Отображение вывода PLAN_TABLE.

Отобразите самые последние выходные данные таблицы плана, используя следующие сценарии:

UTLXPLS. SQL — показывает выходные данные таблицы плана для последовательной обработки..

UTLXPLP. SQL — показывает вывод таблицы плана со столбцами параллельного выполнения..

Значения счетчика источников строк в выходных данных EXPLAIN PLAN определяют количество строк, обрабатываемых на каждом этапе плана. Это поможет вам определить неэффективность запроса; например, источник строки с планом доступа, выполняющий неэффективные операции.

Столбцы выходной таблицы.

PLAN_TABLE, используемый оператором EXPLAIN PLAN, содержит следующие столбцы:

Таблица 5-1 Столбцы PLAN_TABLE (страница 1 из 3)

Столбец Описание.

Значение необязательного параметра STATEMENT_ID, указанного в операторе EXPLAIN PLAN..

Дата и время, когда был выпущен оператор EXPLAIN PLAN..

Любой комментарий (до 80 байт), который вы хотите связать с каждым шагом объясненного плана. Если вам нужно добавить или изменить примечание к любой строке PLAN_TABLE, используйте оператор UPDATE, чтобы изменить строки PLAN_TABLE. .

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

См. Таблицу 5-4 для получения дополнительной информации о значениях для этого столбца..

Вариант операции, описанной в столбце ОПЕРАЦИЯ.

См. Таблицу 5-4 для получения дополнительной информации о значениях этого столбца..

Имя ссылки базы данных, используемой для ссылки на объект (имя таблицы или имя представления). Для локальных запросов, использующих параллельное выполнение, этот столбец описывает порядок, в котором потребляются выходные данные операций..

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

Имя таблицы или индекса.

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

Модификатор, предоставляющий описательную информацию об объекте; например, НЕТ — УНИКАЛЬНО для индексов.

Текущий режим оптимизатора.

В настоящее время не используется.

Номер, присвоенный каждому шагу в плане выполнения..

Идентификатор следующего шага выполнения, который работает на выходе шага идентификатора..

Порядок обработки шагов с одинаковым PARENT_ID .

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

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

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

Описывает содержимое столбца OTHER. См. Таблицу 5-2 для получения дополнительной информации о возможных значениях для этого столбца..

Начальный раздел диапазона доступных разделов. Может принимать одно из следующих значений:

n указывает, что начальный раздел был идентифицирован компилятором SQL, а его номер раздела равен n .

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

ROW LOCATION указывает, что начальный раздел (такой же, как конечный раздел) будет вычисляться во время выполнения из местоположения каждой извлекаемой записи. Местоположение записи определяется пользователем или из глобального индекса..

INVALID указывает, что диапазон доступных разделов пуст.

Остановить раздел диапазона доступных разделов. Может принимать одно из следующих значений:

n указывает, что стоп-раздел был идентифицирован компилятором SQL, а его номер раздела равен n .

KEY указывает, что стоп-раздел будет идентифицирован во время выполнения на основе значений ключей разделения..

ROW LOCATION указывает, что стоп-раздел (такой же, как и стартовый) будет вычисляться во время выполнения из местоположения каждой извлекаемой записи. Местоположение записи определяется пользователем или из глобального индекса..

INVALID указывает, что диапазон доступных разделов пуст.

Шаг, на котором была вычислена пара значений столбцов PARTITION_START и PARTITION_STOP..

Другая информация, относящаяся к этапу выполнения, которая может оказаться полезной для пользователя..

Сохраняет метод, используемый для распределения строк с серверов запросов-производителей на серверы запросов-потребителей..

В таблице 5-2 описаны значения, которые могут отображаться в столбце OTHER_TAG..

Таблица 5-2 Значения столбца OTHER_TAG таблицы PLAN_TABLE.

OTHER_TAG Текст (примеры) Значение Интерпретация.

пустой.

Серийное исполнение.

Последовательный с пульта.

Последовательное выполнение на удаленном сайте.

От последовательного к параллельному.

Серийное исполнение; вывод шага разделяется или транслируется на серверы параллельного выполнения.

Параллельно параллельному.

Параллельное исполнение; вывод шага перераспределяется на второй набор серверов параллельного исполнения.

Параллельно с последовательным.

Параллельное исполнение; вывод шага возвращается в серийный "координатор запросов" процесс.

Параллельно в сочетании с родителем.

Параллельное исполнение; вывод шага переходит к следующему шагу в том же параллельном процессе. Нет межпроцессного взаимодействия с родителем.

Параллельно сочетается с ребенком.

В таблице 5-3 описаны значения, которые могут отображаться в столбце РАСПРЕДЕЛЕНИЕ:

Таблица 5-3 Значения столбца DISTRIBUTION таблицы PLAN_TABLE.

РАСПРОСТРАНЕНИЕ Текстовая интерпретация.

Сопоставляет строки с серверами запросов на основе разделения таблицы или индекса с использованием идентификатора строки для UPDATE / DELETE .

Сопоставляет строки с серверами запросов на основе разделения таблицы или индекса с использованием набора столбцов. Используется для частичного соединения по разделам, PARALLEL INSERT, CREATE TABLE AS SELECT для многораздельной таблицы и CREATE PARTITIONED GLOBAL INDEX .

Сопоставляет строки с серверами запросов, используя хеш-функцию для ключа соединения. Используется для ПАРАЛЛЕЛЬНОГО СОЕДИНЕНИЯ или ПАРАЛЛЕЛЬНОЙ ГРУППЫ ПО .

Сопоставляет строки с серверами запросов, используя диапазоны ключа сортировки. Используется, когда оператор содержит предложение ORDER BY.

Случайно отображает строки на серверы запросов.

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

Координатор запросов потребляет ввод по порядку, от первого до последнего сервера запросов. Используется, когда оператор содержит предложение ORDER BY.

Таблица 5-4 перечисляет каждую комбинацию OPERATION и OPTION, созданную оператором EXPLAIN PLAN, и ее значение в плане выполнения..

Таблица 5-4 Значения OPERATION и OPTION, полученные с помощью EXPLAIN PLAN (Страница 1 из 4)

Операция Вариант Описание.

Операция принимает несколько наборов идентификаторов строк, возвращает пересечение наборов, устраняет дубликаты. Используется для пути доступа к индексам с одним столбцом.

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

FROM ROWIDS преобразует идентификаторы строк в растровое представление.

COUNT возвращает количество идентификаторов строк, если фактические значения не нужны.

SINGLE VALUE ищет в растровом изображении единственное значение ключа в индексе.

RANGE SCAN извлекает растровые изображения для диапазона ключевых значений.

FULL SCAN выполняет полное сканирование индекса растрового изображения, если нет кнопки запуска или остановки.

Объединяет несколько растровых изображений, полученных в результате сканирования диапазона, в одно растровое изображение.

Вычитает биты одного растрового изображения из другого. Источник строки используется для инвертированных предикатов. Может использоваться, только если есть неотрицательные предикаты, дающие растровое изображение, из которого может происходить вычитание. Пример приведен в "Индексы Bitmap и EXPLAIN PLAN" .

Вычисляет побитовое ИЛИ двух растровых изображений.

Извлекает строки в иерархическом порядке для запроса, содержащего предложение CONNECT BY.

Операция, принимающая несколько наборов строк, возвращающая объединение всех наборов.

Операция подсчета количества строк, выбранных из таблицы.

Операция подсчета, при которой количество возвращаемых строк ограничено выражением ROWNUM в предложении WHERE.

Получение одного или нескольких идентификаторов строк из индекса домена.

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

Получение только первой строки, выбранной запросом.

Операция получения и блокировки строк, выбранных запросом, содержащим предложение FOR UPDATE.

(Это операции соединения.)

Операция объединения двух наборов строк и возврата результата.

Хеш-анти-присоединение.

Полусоединение хэша.

(Это методы доступа.)

Получение одного идентификатора строки из индекса.

Получение одного или нескольких идентификаторов строк из индекса. Проиндексированные значения сканируются в порядке возрастания..

Получение одного или нескольких идентификаторов строк из индекса. Проиндексированные значения сканируются в порядке убывания..

Обходит операцию под ним для каждого значения в предикате IN -list.

Операция, принимающая два набора строк и возвращающая пересечение наборов, устраняя дубликаты.

(Это операции соединения.)

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

Операция объединения слиянием для выполнения оператора внешнего соединения.

Объединить анти-присоединение.

Полусоединение слияния.

Получение строк в иерархическом порядке для запроса, содержащего предложение CONNECT BY.

Операция, принимающая два набора строк и возвращающая строки, появляющиеся в первом наборе, но не во втором, устранение дубликатов.

(Это операции соединения.)

Операция, принимающая два набора строк, внешний набор и внутренний набор. Oracle сравнивает каждую строку внешнего набора с каждой строкой внутреннего набора, возвращая строки, удовлетворяющие условию.

Операция вложенных циклов для выполнения оператора внешнего соединения.

Доступ к одному разделу.

Доступ ко многим разделам (подмножеству).

Доступ ко всем разделам.

Аналогичен итератору, но основан на предикате IN -list.

Указывает, что доступный набор разделов пуст.

Выполняет итерацию по операции под ним для каждого раздела в диапазоне, заданном столбцами PARTITION_START и PARTITION_STOP..

PARTITION описывает границы раздела, применимые к одному секционированному объекту (таблице или индексу) или к набору равнораздельных объектов (секционированная таблица и ее локальные индексы). Границы раздела задаются значениями PARTITION_START и PARTITION_STOP РАЗДЕЛА. Обратитесь к Таблице 5-1 для получения информации о допустимых значениях запуска / остановки раздела..

Получение данных из удаленной базы данных.

Операция, включающая доступ к значениям последовательности.

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

Операция сортировки набора строк для устранения дубликатов.

Операция сортировки набора строк по группам для запроса с предложением GROUP BY.

Операция сортировки набора строк перед объединением слиянием.

Операция сортировки набора строк для запроса с предложением ORDER BY.

(Это методы доступа.)

Получение всех строк из таблицы.

Получение строк из таблицы на основе значения индексированного ключа кластера.

Получение строк из таблицы на основе значения ключа хеш-кластера.

Получение строки из таблицы на основе ее rowid.

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

Если таблица не разбита на разделы и строки расположены с использованием индекса (ов).

Если таблица секционирована и строки расположены с использованием только глобальных индексов.

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

Границы раздела могли быть вычислены с помощью:

Предыдущий шаг PARTITION, и в этом случае значения столбцов PARTITION_START и PARTITION_STOP копируют значения, представленные на шаге PARTITION, а PARTITION_ID содержит идентификатор шага PARTITION. Возможные значения для PARTITION_START и PARTITION_STOP: NUMBER (n), KEY, INVALID .

Сам шаг TABLE ACCESS или INDEX, и в этом случае PARTITION_ID содержит идентификатор шага. Возможные значения для PARTITION_START и PARTITION_STOP: NUMBER (n), KEY, ROW LOCATION (только ДОСТУП К ТАБЛИЦЕ) и INVALID. .

Операция принимает два набора строк и возвращает объединение наборов, удаляя дубликаты..

Методы доступа и операции соединения обсуждаются в Концепции Oracle8i..

Индексы Bitmap и EXPLAIN PLAN.

Источники строк индекса, использующие растровые индексы, появляются в выходных данных EXPLAIN PLAN со словом BITMAP, указывающим тип индекса. Рассмотрим следующий пример запроса и план:

ВЫБРАТЬ ДОСТУП К ТАБЛИЦЕ ЗАЯВЛЕНИЯ T ПО ИНДЕКСУ ROWID BITMAP CONVERSION TO ROWID BITMAP OR BITMAP MINUS BITMAP MINUS BITMAP INDEX C1_IND SINGLE VALUE BITMAP INDEX C2_IND SINGLE VALUE BITMAP INDEX C2_IND SINGLE VALUE BITMAP INDEX C2_IND SINGLE VALUE BITMAP INDEX C2_IND SINGLE VALUE BITMAP INDEX C2_IND SINGLE VALUE BITMAP INDEX C2_IND SINGLE VALUE BITMAP INDEX C2_IND SINGLE VALUE BITMAP INDEX C2_IND SINGLE VALUE BITMAP INDEX C2_IND SINGLE VALUE VALUE BITMAP.

В этом примере предикат c1 = 2 дает битовую карту, из которой может происходить вычитание. Из этой битовой карты вычитаются биты в битовой карте для c2 = 6. Кроме того, вычитаются биты в битовой карте для c2 IS NULL, что объясняет, почему в плане есть два источника строк MINUS. Вычитание NULL необходимо для семантической корректности, если столбец не имеет ограничения NOT NULL. Параметр TO ROWIDS используется для генерации ROWID, необходимых для доступа к таблице..

ОБЪЯСНЕНИЕ ПЛАНА и многораздельных объектов.

Используйте EXPLAIN PLAN, чтобы увидеть, как Oracle обращается к секционированным объектам для конкретных запросов..

Разделы, к которым осуществляется доступ после сокращения, показаны в столбцах НАЧАЛО РАЗДЕЛА и ОСТАНОВКА РАЗДЕЛА. Имя источника строки для раздела диапазона: " ДИАПАЗОН РАЗДЕЛА ". Для хеш-разделов имя источника строки — PARTITION HASH. .

Соединение реализуется с использованием частичного соединения по разделам, если столбец DISTRIBUTION таблицы плана одной из соединенных таблиц содержит PARTITION (KEY). Частичное соединение по разделам возможно, если одна из соединенных таблиц разделена на свой столбец соединения и таблица распараллеливается..

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

Отображение диапазона и хеш-секционирования с EXPLAIN PLAN.

Рассмотрим следующую таблицу emp_range, секционированную по диапазону при найме, чтобы проиллюстрировать, как отображается сокращение. Предположим, что существуют таблицы emp и dept из стандартной схемы Oracle..

) КАК ВЫБРАТЬ * ИЗ emp;

Пример 1а.

Введите следующее, чтобы отобразить вывод EXPLAIN PLAN:

Oracle отображает что-то похожее на:

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

В примере 1a итератор раздела охватывает все разделы (опция ALL), поскольку предикат не использовался для сокращения. Столбцы PARTITION_START и PARTITION _ STOP таблицы плана показывают доступ ко всем разделам с 1 по 5..

Пример 2а.

В примере 2a источник строки раздела выполняет итерацию от раздела 4 к 5, потому что мы сокращаем другие разделы, используя предикат на hiredate. .

Пример 3а.

В примере 3a только раздел 1 доступен и известен во время компиляции; таким образом, нет необходимости в источнике строки раздела.

Планы по разделению хэша.

Oracle отображает ту же информацию для объектов, секционированных по хешу, за исключением того, что имя источника строки раздела — PARTITION HASH вместо PARTITION RANGE. Кроме того, с хеш-секционированием сокращение возможно только с использованием предикатов равенства или IN-list..

Удаление информации с помощью составных секционированных объектов.

Чтобы проиллюстрировать, как Oracle отображает информацию об отсечении для составных секционированных объектов, рассмотрим таблицу emp_comp, которая секционирована по диапазону на hiredate и подразделяется по хешу на deptno. .

) КАК ВЫБРАТЬ * ИЗ emp;

Пример 1b.

В примере 1b показан план, когда Oracle обращается ко всем подразделам всех разделов составного объекта. Для этой цели используются два источника строк раздела: источник строки раздела диапазона для итерации по разделам и источник строки хэш-раздела для итерации по подразделам каждого раздела, к которому осуществляется доступ..

Использование EXPLAIN PLAN использование

В примере 1b, поскольку отсечение не выполняется, источник строки раздела диапазона выполняет итерацию от раздела 1 до 5. Внутри каждого раздела источник строки хеш-раздела выполняет итерацию по подразделам с 1 по 3 текущего раздела. В результате источник строки доступа к таблице обращается к подразделам с 1 по 15. Другими словами, он обращается ко всем подразделам составного объекта..

Пример 2б.

В примере 2b осуществляется доступ только к последнему разделу, разделу 5. Этот раздел известен во время компиляции, поэтому нам не нужно показывать его в плане. Источник строки хеш-раздела показывает доступ ко всем подразделам в этом разделе; то есть подразделы с 1 по 3, что переводится в разделы с 13 по 15 таблицы emp_comp.

Пример 3б.

В примере 3b предикат deptno = 20 позволяет отсекать размерность хэша внутри каждого раздела, поэтому Oracle требуется доступ только к одному подразделу. Номер этого подраздела известен во время компиляции, поэтому источник строки хеш-раздела не требуется..

Пример 4b.

Пример 4b аналогичен примеру 3b, за исключением того, что deptno = 20 заменено на deptno =: dno. В этом случае номер подраздела неизвестен во время компиляции, и выделяется источник строки хэш-раздела. Параметр SINGLE для этого источника строки, потому что Oracle обращается только к одному подразделу в каждом разделе. PARTITION _ START и PARTITION _ STOP установлены на KEY. Это означает, что Oracle определяет номер подраздела во время выполнения..

Соединения с частичным разделением.

Пример 1c.

В этом примере emp_range объединяется в столбце разделения и распараллеливается. Это позволяет использовать частичное соединение по разделам, поскольку таблица dept не разделена. Oracle динамически разбивает таблицу dept перед соединением.

ALTER TABLE dept PARALLEL 2;

Чтобы показать план запроса, введите:

План показывает, что оптимизатор выбирает соединение по разделам, потому что столбец DIST содержит текст PART (KEY) или ключ раздела.

Пример 2c.

В примере 2c emp_comp объединяется по своему столбцу хеш-секционирования deptno и распараллеливается. Это позволяет использовать частичное соединение по разделам, поскольку таблица dept не разделена. Опять же, Oracle динамически разбивает таблицу dept.

ОБЪЯСНИТЬ ПЛАН ДЛЯ ВЫБОРА / * + ЗАКАЗАННОЕ ИСПОЛЬЗОВАНИЕ_HASH (D) * / ename, dname.

Полные соединения с разбиением на разделы.

В следующем примере emp_comp и dept_hash объединены по их столбцам хеш-секционирования. Это позволяет использовать полное соединение по разделам. Источник строки PARTITION HASH отображается поверх источника строки соединения в выходных данных таблицы плана..

Чтобы создать таблицу dept_hash, введите:

Чтобы показать план запроса, введите:

INLIST ITERATOR и EXPLAIN PLAN.

Операция INLIST ITERATOR появляется в выходных данных EXPLAIN PLAN, если индекс реализует предикат IN -list. Например, для запроса:

Результат EXPLAIN PLAN выглядит следующим образом:

Операция INLIST ITERATOR повторяет операцию под ней для каждого значения в предикате IN -list. Для многораздельных таблиц и индексов три возможных типа столбцов IN-list описаны в следующих разделах..

Столбец индекса.

Если столбец IN-list empno является столбцом индекса, но не столбцом раздела, то план следующий (оператор IN -list появляется над операцией таблицы, но под операцией разделения):

Обозначение KEY (INLIST) для ключей запуска и остановки раздела указывает, что предикат IN -list появляется на ключах запуска / остановки индекса..

Столбец индекса и раздела.

Если empno является индексированным и разделенным столбцом, то план содержит операцию INLIST ITERATOR над операцией разделения:

Колонка раздела.

Если empno является столбцом раздела и индексов нет, то операция INLIST ITERATOR не выделяется:

Если emp_empno — это растровый индекс, то план следующий:

Индексы доменов и EXPLAIN PLAN.

Вы также можете использовать EXPLAIN PLAN для получения определяемых пользователем затрат ЦП и ввода-вывода для индексов домена. EXPLAIN PLAN отображает эту статистику в столбце OTHER таблицы PLAN_TABLE. .

Например, предположим, что таблица emp имеет пользовательский оператор CONTAINS с индексом домена emp_resume в столбце резюме, а тип индекса emp_resume поддерживает оператор CONTAINS. Тогда запрос:

может отображать следующий план:

ОБЪЯСНЕНИЕ ПЛАНА Ограничения.

Oracle не поддерживает EXPLAIN PLAN для операторов, выполняющих неявное преобразование типов переменных привязки даты. При использовании переменных связывания в целом вывод EXPLAIN PLAN может не отражать реальный план выполнения..

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

Похожие статьи