Oracle unusable index что это
Порядок столбцов в операторе «Создание индекса» может повлиять на производительность запроса. Как правило, когда вы создаете композитный индекс, столбец часто использует в первом.
Если мы создадим композитный индекс для ускорения скорости запроса, такого как COL1, COL2 и COL3; затем только доступ к COL1 или только для доступа к Coll1 и COL2 будет ускорить. Но только доступ к COL2, только COL3 или запрос только COL2 и COL3 не будет использовать индексы.
Есть ли ограниченное количество кандидатов?
Стол может построить ряд индексов. Тем не менее, чем больше индексов, тем больше стоимость модификации таблицы. В частности, все индексы на таблице должны быть обновлены при вложении или удалении строк. Кроме того, при обновлении столбцов все индексы, содержащие столбец, должны быть обновлены.
Что такое индекс делеции?
- Он не ускоряет скорость запроса. Эта таблица может быть маленькой, или может быть много линий без записей индекса в таблице.
- Запрос программы не использует индексы
- Удалить оригинальный индекс до восстановления
Вы можете создать индекс, параллельный для создания индекса, используя головы
Вышеуказанные две операции - это экономия временной экономии, которые, конечно, создают параллельное создание, требует большего количества процессов, тогда требуется больше ресурсов. Огромные варианты уменьшают поколение Redo, и созданные большие показатели параллельно могут улучшить производительность.
Индекс недоступен:
Когда вы ввели много данных в таблицу, вы можете сделать индекс сначала непригодными, импортировать данные и восстановить индекс, который может повысить эффективность импорта. Вы можете создать неиспользуемый индекс, который может изменить статус индекса как нелюбимый, например, при создании неисправности индекса индекс помечен как непригодным для использования. Когда индекс разбиемого раздела помечен как неиспользуемый, индекс других разделов доступен. Индекс индекса или раздела, который нельзя использовать, должны быть восстановлены, удалены или воссозданы до того, как его можно будет использовать. Таблица усечения сделает неиспользуемый индекс, который будет доступен.
Параметр Skip_unusable_indexes установлен на true:
- Заявление о DML таблицы продолжается, но не поддерживает индекс
- Если есть недоступное ограничение, то DML бросит ошибку, чтобы остановить выполнение.
- Для неразделенных индексов оптимизатор не учитывает недоступный индекс при создании плана выполнения для оператора SELECT. Единственным исключением является явное указать индекс с использованием аннотаций INDEX ().
- Для индекса раздела, который недоступен для одного или нескольких разделов, если оптимизатор не может определить, может ли какой-либо раздел индекса можно отключить при компиляции запроса, оптимизатор не учитывает индекс. Это верно для таблиц разделов и не разделов. Единственным исключением является явное указать индекс с использованием аннотаций INDEX ().
Skip_unusable_indexes Параметры Это только false:
- Если существует недоступный индекс или раздел индекс, оператор DML этих индексов или разделов индекса будет завершен.
- Для оператора SELECT, если есть индекс или индекс раздела, который нельзя использовать, оптимизатор выполняет план без использования неиспользуемого индекса, то оператор продолжается. Однако, если оптимизатор выбирает неприятный индекс или неиспользуемый индекс раздела, оператор сообщит об ошибке для выполнения.
Индекс невидимый:
От базы данных Oracle 11G 1st вы можете создавать невидимые индексы или невидимые существующие индексы. Если вы не установите параметр инициализации OPTIONIZER_INVISIBLE_INDEXES, чтобы TRUE на сеансе или системном уровне, оптимизатор будет игнорировать невидимый индекс. В отличие от недопустимых индексов, невидимые индексы поддерживаются во время оператора DML. Хотя индекс раздела может быть установлен невидимым, видно, что другие индексы раздела можно увидеть без установки отдельного индекса раздела. С невидимым индексом вы можете сделать следующее:
- Проверьте индекс перед удалением индекса.
- Временную структуру индекса для некоторых из приложений или модулей, не влияющих на все приложение.
Взвешивание индекса или индекс реконструкции
Индекс реконструкции | Слияние индекса |
---|---|
Может быстро переместить индексы в другие табличные пространства | Не может перемещать индексы в другие табличные пространства |
Высокий накладной расход, нужно больше дискового пространства | Низкий накладной расход, нет больше дискового пространства |
Создайте новое дерево, уменьшите глубину дерева как можно больше | Мистер Листья в той же ветке дерева |
Возможность быстрого изменения параметров хранения и табличного пространства без необходимости удаления исходного индекса | Быстро выпустить индекс листьев для использования |
Блок индекса B дерева BLEX может быть выпущен, и эти блоки листьев объединяются с использованием следующего утверждения:
Рисунок 21-1 иллюстрирует влияние сочетания индекса ALTER для индекса VMOORE. Перед операцией первые два листа были более 50%. Следовательно, мусор может быть уменьшен и полностью заполнен первым блоком, а второй блок выделяется.
Рассмотреть расходы до отключения или удаления ограничений
Поскольку уникальные ограничения и ограничения первичных ключей имеют индекс, рассмотреть вопрос о незакреплении или удалении уникальных или первичных ключевых ограничений, рассмотрите возможность удаления и создания стоимости индекса. Если индекс уникальной кнопки или ограничения первичного ключа очень большой, вы можете сэкономить время, включив ограничения, а не удалять и воссоздать индекс. Вы также можете выбрать указать индекс, чтобы сохранить или удалить при удалении или отключении уникальных или первичных ключевых ограничений.
Давайте введем конкретный экземпляр синтаксиса SQL:
Здесь, наведенные и следующие параметры хранения указаны здесь
- Создать уникальный индекс
- Создайте индекс, связанный с ограничениями, могут быть реализованы несколько методов
- Создать отличный индекс
- Создайте большое временное пространство табличного стола, используйте его для создания индекса
- Используйте ALTER пользователь для переключения временного пространства табличного пространства
- Создать индекс
- Удалить это большое временное пространство табличного стола, переключитесь на исходное пространство временного стола, используя команду ALTER USER
- Создать индекс онлайн
- Создать индекс функции
- Создать сжатый индекс
- Создайте неверный индекс
- Создать невидимый индекс
- Индекс реконструкции
- Индекс недоступен
- Сделать индексы невидимыми
- Индекс монитора
- Контролировать использование места индекса
- Удалить индекс
- Связанный словарь данных
Взгляд головы DBA описывает информацию индекса для всех таблиц в базе данных. Взгляд всей заголовки описывает информацию индекса на всех доступных таблицах. Заголовок пользователя ограничен информацией индекса, принадлежащей пользователю. Некоторые столбцы в этих представлениях содержат статистику, сгенерированную пакетом DBMS_STATS или аналитическим утверждением.
DBA_INDEXES
ALL_INDEXES
USER_INDEXES
Следующий вид описывает информацию о перечисленных столбцах
DBA_IND_COLUMNS
ALL_IND_COLUMNS
USER_IND_COLUMNS
Таблица описания этих представлений на основе выражений индексации функций
DBA_IND_EXPRESSIONS
ALL_IND_EXPRESSIONS
USER_IND_EXPRESSIONS
Эти взгляды содержат информацию каждого индекса раздела, информацию о уровне разбиения, параметры хранения раздела и различной статистики раздела, создаваемых пакетом DBMS_STATS
DBA_IND_PARTITIONS
ALL_IND_PARTITIONS
USER_IND_PARTITIONS
Эти взгляды содержат индексированную статистику оптимизатора
DBA_IND_STATISTICS
ALL_IND_STATISTICS
USER_IND_STATISTICS
Статистика последнего анализа индекса анализа . Validate Структурное заявление
INDEX_STATS
INDEX_HISTOGRAM
Содержит информацию об использовании индекса, сгенерированную по индексу ALTE . Мониторинг использования
V$OBJECT_USAGE
To alter an index, your schema must contain the index or you must have the ALTER ANY INDEX system privilege. With the ALTER INDEX statement, you can:
Rebuild or coalesce an existing index
Deallocate unused space or allocate a new extent
Specify parallel execution (or not) and alter the degree of parallelism
Alter storage parameters or physical attributes
Specify LOGGING or NOLOGGING
Enable or disable key compression
Mark the index unusable
Make the index invisible
Rename the index
Start or stop the monitoring of index usage
You cannot alter index column structure.
More detailed discussions of some of these operations are contained in the following sections:
Oracle Database SQL Language Reference for details on the ALTER INDEX statement
Rebuilding an Existing Index
Before rebuilding an existing index, compare the costs and benefits associated with rebuilding to those associated with coalescing indexes as described in Table 21-1.
When you rebuild an index, you use an existing index as the data source. Creating an index in this manner enables you to change storage characteristics or move to a new tablespace. Rebuilding an index based on an existing data source removes intra-block fragmentation. Compared to dropping the index and using the CREATE INDEX statement, re-creating an existing index offers better performance.
The following statement rebuilds the existing index emp_name :
The REBUILD clause must immediately follow the index name, and precede any other options. It cannot be used in conjunction with the DEALLOCATE UNUSED clause.
You have the option of rebuilding the index online. Rebuilding online enables you to update base tables at the same time that you are rebuilding. The following statement rebuilds the emp_name index online:
To rebuild an index in a different user's schema online, the following additional system privileges are required:
CREATE ANY TABLE
CREATE ANY INDEX
Online index rebuilding has stricter limitations on the maximum key length that can be handled, compared to other methods of rebuilding an index. If an ORA-1450 (maximum key length exceeded) error occurs when rebuilding online, try rebuilding offline, coalescing, or dropping and recreating the index.
If you do not have the space required to rebuild an index, you can choose instead to coalesce the index. Coalescing an index is an online operation.
Re naming an Index
To rename an index, issue this statement:
Переключатель Kotlin
В Котлине нет оператора коммутатора, и это DESI. Способ Джавы: Котлин написание: .
Удаление раздела таблицы разделов Oracle вызывает ошибку ORA-01502: индекс или раздел этого типа индекса недоступен .
(1) Вопрос:
Недавно я занимался очисткой данных Oracle. При очистке таблицы разделов использовался метод удаления раздела. Во время процесса удаления никаких проблем не возникло. Примерно через 10 минут разработчики сообщили, что бизнес потерпел неудачу на некоторых таблицах разделов. Конкретная ошибка:
Ошибка ORA-01502: индекс или раздел такого индекса находится в непригодном для использования состоянии (на английском языке: ora-01502: index'schema.index_name 'или раздел такого индекса находится в непригодном для использования состоянии).
(2) Анализ причин
Если посмотреть на проблемные многораздельные таблицы, у всех них есть одна общая черта: индексы в таблице, начинающиеся с «pk_», находятся в непригодном для использования состоянии, а индексы, начинающиеся с «pk_», создаются с созданием ограничений первичного ключа. Когда пользователь создает ограничение первичного ключа или ограничение уникальности, уникальный индекс будет создан в соответствующем столбце.
После проверкиОбнаружено, что при удалении раздела таблица разделов становится Уникальный глобальный индекс В недоступном состоянии новые данные не могут быть вставлены нормально, что и вызвало ошибку.
Приводит ли недоступность индекса к сбою операции DML? После проверки были обнаружены следующие характеристики:
1. ДляНеединственностьИндекс, если индекс недоступен, это не повлияет на работу DML;
2. ДляУникальностьИндекс, если индекс недоступен, во время операций DML будет срабатывать ошибка ORA-01502;
Вот запись того, какие операции приведут к тому, что индекс станет недействительным:
Рисунок 1. Сводка причин сбоя индекса
(3) Решение
(3.1) Понимать Уникальный индекс
Прежде чем решать проблему, давайте проанализируем, какое поведение создаст уникальный индекс (3 типа):
-Создайте уникальный индекс напрямую.
Синтаксис: CREATE UNIQUE INDEX имя_индекса для имя_таблицы (col1, col2, . );
-Создание уникального индекса автоматически при создании ограничения первичного ключа.
Синтаксис: ALTER TABLE имя_таблицы ADD CONSTRAINT имя_ограничения PRIMARY KEY (col1, col2, ..);
-Создание уникального индекса автоматически при создании уникального ограничения.
Синтаксис: ALTER TABLE имя_таблицы ADD CONSTRAINT имя_ограничения UNIQUE (col1, col2,…);
Здесь я суммировал 3 набора решений, соответствующих проблеме ORA-01502.
(3.2) Вариант первый : Удалить уникальный индекс
Свяжитесь с компанией, чтобы подтвердить, можно ли удалить уникальный индекс. Если да, удалите индекс напрямую. Синтаксис удаления:
Уникальный индекс, созданный ограничением первичного ключа или ограничением уникальности, не может быть удален напрямую
Правильный способ - удалить соответствующие ограничения.
резюме: Этот метод прост и груб, при условии, что его можно использовать только тогда, когда ограничение или индекс можно удалить в бизнесе.
(3.3) Вариант II : Перестроить уникальный индекс (для несекционированных таблиц)
резюме: Этот метод может сделать индекс доступным. Но для многораздельных таблиц все еще существует проблема: после удаления следующего раздела статус индекса снова станет недоступным.
(3.4) третье решение : Удалить недоступные индексы и создать уникальные индексы секций (для секционированных таблиц)
Создайте уникальный индекс раздела:
Для ограничений первичного ключа и ограничений уникальности вы можете использовать следующий синтаксис для добавления уникальных индексов локальных секций:
резюме: Этот метод может эффективно решить проблему недоступности индекса, вызванную удалением раздела таблицы разделов.
Приложение: имитационный эксперимент
(1) Сначала смоделируйте производственную ситуацию и создайте таблицу:
Вставьте данные, чтобы убедиться, что в каждом разделе есть данные
Проверить данные информации в базе данных
(2) Когда возникает проблема ORA-01502, объекты, связанные с таблицей, имеют только ограничения первичного ключа и индексы. Итак, я создал индексы и ограничения для таблицы и подтвердил, что все индексы доступны.
Подтвердите статус индекса:
Для индексов «SALES_PK» и «INX_SALES_1» статус индекса доступен, а статус индекса «INX_SALES_2» - «N / A». Что происходит? После поиска информации подтверждается, что индекс имеет четыре состояния:
- Н / Д: Объясните, что этоРазделИндексу необходимо проверить user_ind_partitions или user_ind_subpartitions, чтобы определить, доступен ли каждый раздел;
- VAILD: это означает, что этот индекс доступен;
- UNUSABLE: указывает, что этот индекс недоступен;
- ИСПОЛЬЗОВАНИЕ: Описание этого индекса.РазделЭто доступно.
Давайте проверим словарь данных DBA_IND_PARTITIONS, чтобы подтвердить статус «INX_SALES_2» и доступность индекса.
Подтвердите статус ограничения первичного ключа и убедитесь, что оно доступно
(3) Далее моделируем очистку данных и удаляем раздел sales_q1_2017.
Проверьте данные таблицы разделов, вы увидите, что данные раздела "sales_q1_2017" были удалены вместе с разделом
(4) В это время мы смоделировали обычные бизнес-операции и обнаружили следующие
- Для операции обновления, если столбец, связанный с первичным ключом, не задействован, она может быть выполнена успешно.Если задействован столбец первичного ключа, будет выдана ошибка ORA-01502;
Чтобы еще раз подтвердить статус индекса, вы можете увидеть, что нормальный статус индекса изменился на недоступный, а статус индекса локального раздела не изменился.
Статус ограничения первичного ключа также изменяется
Здесь мы делаем сводку сравнения информации таблицы до и после раздела deop.
Для сравнения, мы можем предположить, что недоступность индекса привела к сбою нормальной операции DML. Итак, какой индекс вызывает проблему?
(5) Сначала проверьте обычный индекс, сначала перестройте индекс INX_SALES_1.
Продолжайте моделировать транзакции DML, ситуация такая же, как и с результатами DML после удаления раздела, вы можете подтвердить,Недоступность обычных индексов не приведет к сбою операций DML.
(6) Затем перестройте уникальный индекс "SALE_PK".
DML-операции с таблицей SALES могут выполняться нормально.
Так далеко,Можно смело догадываться: проблема ORA-01502 вызвана уникальным индексом.Поскольку мы не создавали напрямую уникальный индекс при создании индекса, а уникальный индекс, который был автоматически создан при создании ограничения первичного ключа, является ли это проблемой ограничений первичного ключа или уникального индекса? Согласно вышесказанному, состояние ограничения одинаково до и после удаления раздела, но состояние индекса отличается. Я думаю, что это проблема индекса.。Продолжайте проверять. Мы создаем новую таблицу, создаем уникальный индекс прямо на ней, не создавая никаких ограничений.
Создайте таблицу test01 и введите данные
Создайте уникальный индекс в столбце «ID».
Вставить данные, без исключения
Затем установите индекс в недоступное состояние, а затем вставьте данные в таблицу, произошла ошибка 01502;
Пока мы можем четко сказать:Ошибка ORA-01512 вызвана ошибкой уникального индекса.
Как решить эту проблему, три решения приведены выше, если вы выберете одно из них, больше никаких симуляций.
Making an Index Unusable
When you make an index unusable, it is ignored by the optimizer and is not maintained by DML. When you make one partition of a partitioned index unusable, the other partitions of the index remain valid.
You must rebuild or drop and re-create an unusable index or index partition before using it.
The following procedure illustrates how to make an index and index partition unusable, and how to query the object status.
To make an index unusable:
Query the data dictionary to determine whether an existing index or index partition is usable or unusable.
For example, issue the following query (output truncated to save space):
The preceding output shows that only index partition p1_i_emp_ename is unusable.
Make an index or index partition unusable by specifying the UNUSABLE keyword.
The following example makes index emp_email_uk unusable:
The following example makes index partition p2_i_emp_ename unusable:
Optionally, query the data dictionary to verify the status change.
For example, issue the following query (output truncated to save space):
A query of space consumed by the i_emp_ename and emp_email_uk segments shows that the segments no longer exist:
Oracle Database SQL Language Reference for more information about the UNUSABLE keyword, including restrictions
Интеллектуальная рекомендация
Altering Storage Characteristics of an Index
Alter the storage parameters of any index, including those created by the database to enforce primary and unique key integrity constraints, using the ALTER INDEX statement. For example, the following statement alters the emp_ename index:
The parameters INITIAL and MINEXTENTS cannot be altered. All new settings for the other storage parameters affect only extents subsequently allocated for the index.
For indexes that implement integrity constraints, you can adjust storage parameters by issuing an ALTER TABLE statement that includes the USING INDEX subclause of the ENABLE clause. For example, the following statement changes the storage options of the index created on table emp to enforce the primary key constraint:
Oracle Database SQL Language Reference for syntax and restrictions on the use of the ALTER INDEX statement
LeetCode 595. Big Countries
LeetCode 595. Big Countries тема There is a table World A country is big if it has an area of bigger than 3 million square km or a population of more than 25 million. Write a SQL solution to output bi.
TIDB Двоичного Источник чтение Чтение статья (7) Drainer сервер Введение
Автор: Хуан Jiahao В предыдущей статье вводится насос сервер, давайте познакомимся реализация Drainer сервера, главная роль Drainer сервера, чтобы получить Двоичный от каждого сервера насоса, и анализ.
Making an Index Invisible
An invisible index is ignored by the optimizer unless you explicitly set the OPTIMIZER_USE_INVISIBLE_INDEXES initialization parameter to TRUE at the session or system level. Making an index invisible is an alternative to making it unusable or dropping it. You cannot make an individual index partition invisible. Attempting to do so produces an error.
To make an index invisible:
Submit the following SQL statement:
To make an invisible index visible again:
Submit the following SQL statement:
To determine whether an index is visible or invisible:
Query the dictionary views USER_INDEXES , ALL_INDEXES , or DBA_INDEXES .
For example, to determine if the index ind1 is invisible, issue the following query:
Практика работы с регулярными выражениями
Monitoring Index Usage
Oracle Database provides a means of monitoring indexes to determine whether they are being used. If an index is not being used, then it can be dropped, eliminating unnecessary statement overhead.
To start monitoring the usage of an index, issue this statement:
Later, issue the following statement to stop the monitoring:
The view V$OBJECT_USAGE can be queried for the index being monitored to see if the index has been used. The view contains a USED column whose value is YES or NO , depending upon if the index has been used within the time period being monitored. The view also contains the start and stop times of the monitoring period, and a MONITORING column ( YES / NO ) to indicate if usage monitoring is currently active.
Each time that you specify MONITORING USAGE , the V$OBJECT_USAGE view is reset for the specified index. The previous usage information is cleared or reset, and a new start time is recorded. When you specify NOMONITORING USAGE , no further monitoring is performed, and the end time is recorded for the monitoring period. Until the next ALTER INDEX. MONITORING USAGE statement is issued, the view information is left unchanged.
Пока в запросе не используются подсказки, можно наблюдать ожидаемый («разумный») выбор оптимизатора — использовать индексный доступ INDEX RANGE SCAN когда индекс доступен (статус VALID), и не использовать индекс в статусе UNUSABLE (при этом для доступа к данным используется TABLE FULL SCAN):
И в трейсе 10053 можно найти причины такого выбора:
— т.е. индекс UNUSABLE => значит индексный доступ (INDEX SCAN) невозможен. so far, so good
Если в запросе появляется подсказка INDEX (форсирующая использование unusable индекс) — получаем ошибку и в Oracle 10.2, и в версии 11.2:
несмотря на значение параметра skip_unusable_indexes = TRUE (используется по умолчанию в 10.2 и в 11.2), который согласно документации:
Т.е. подсказка INDEX при выполнении запроса играет более важную роль, чем параметр skip_unusable_indexes, что также отражается в трейсе 10053 оптимизатора:
Что само по себе достаточно странно: Oracle настойчиво пытается использовать индексный доступ в соответствии с пользовательской подсказкой, несмотря на «плохой» статус индекса (хорошо известный оптимизатору, что видно из выполнения запроса без подсказки) !
То же самое происходит при использовании в запросе подсказки RULE (т.е. давно официально не поддерживаемого RBO = Rule Based Optimizer), но только в Oracle 10.2:
Появление последней ошибки как-то можно объяснить: RBO давно не поддерживается, действует точно в соответствии с правилами, по которым индексный доступ считался более приоритетным, чем сканирование таблицы,… и т.д.
НО тот же запрос с подсказкой RULE в Oracle 11.2 выполняется без ошибок(!):
Кроме того, что в версии 11.2 rule based optimizer научился определять статус индекса, трейс события 10053 (т.е. трейс CBO, как я всегда полагал) показывает сформированную секцию OUTLINE с комментарием RBO_OUTLINE (последнее — только в случае установки параметра optimizer_mode=RULE на уровне сессии, без подсказки RULE в запросе)
В том же трейсе можно найти записи в секции Query Transformations — при этом большая часть трансформаций игнорируются по причине использования rule-based mode:
но не все — ORDER BY ELIMINATION (OBYE) не отвергается для RBO, хотя в рассматриваемом случае и не применяется:
Похоже, что механизм rule-based оптимизации был обновлён (и получил развитие) в Oracle 11g R2: «научился» определять состояние индексов, пишет 10053 трейс и, возможно, умеет использовать некоторые операции трансформации запросов (Query Transformations), ранее доступные только интеллигентному Cost-Based оптимизатору?
Сталкиваясь с локально выполняемыми запросами, использующими удалённые UNION ALL обзоры, обратил внимание на особенности формирования рекурсивных запросов, которые могут оказаться полезными для получения гарантированного индексного доступа к удалённым таблицам
UNION ALL обзоры, в свою очередь, иногда используются для обеспечения беспрерывного доступа к данным таблиц (точнее, материализованных представлений, поочерёдно обновляемых в режиме nonatomic complete с целью экономии времени и ресурсов undo/redo). В тескте такого обзора, конечно, используются какие-то PL/SQL функции или SQL конструкции, обеспечиващие в любой момент времени доступ только к одному наиболее «свежему» источнику данных, не влияющие, однако, на наблюдаемые закономерности
Далее нудно и монотонно последовательно описаны тесты, аналогичные проведённым в Уникальные индексы для Join Predicate Push-Down, для механизма, который можно было бы условно назвать remote JPPD для версий 11g/12c
В Oracle 12c в этом месте никаких улучшений не наблюдается, более того, некоторые правила, например, стимулирование удалённого индексного доступа при использовании уникального индексов локальной таблицы в отличие от предыдущих версий уже не работают
Для демонстрации успешно подходит тестовая схема из вышеуказанной заметки:
Далее тесты проводятся на версии 12.1.0.1 с указанием предыдущих версий при необходимости
Запрос к обзору из одной таблицы выполняется красиво и предсказуемо:
- удалённый рекурсивный запрос формируется с предикатом по полю «L1» и использует индексный доступ к таблице T21, что и отражено в правильной Cardinality (Rows = 1) плана выполнения. Кроме того заметно, что оптимизатор знает статистику удалённой таблицы
- интересно, что в 12.1 применяется новая операция TABLE ACCESS BY INDEX ROWID BATCHED, вызванную соответствующей подсказкой BATCH_TABLE_ACCESS_BY_ROWID в секции Outline, несмотря на используемое в запросе условие «=» и указанную справедливую оценку в 1 строку — хотя в арсенале 12c присутствует и классическая одноблочная операция TABLE ACCESS BY INDEX ROWID
С интересующими запросами типа UNION ALL дело обстоит не столь радужно, причём независимо от типа объединяемых таблиц — тесты с упрощённым обзором типа:
— показывают такие же результаты, как и тесты с объединением 2-х реальных таблиц, которые я буду использовать в дальнейшем для правдоподобности:
Первый тест — на влияние уникальности локального индекса:
— в 12c уникальность индекса неожиданно не влияет на рекурсивный запрос к удалённому обзору, который не содержит условий. Как следствие, доступ к удалённым таблицам осуществляется без учёта индексов, что можно видеть и в плане выполнения основного запроса — Rows=2000, и в плане рекурсивного запроса (благо «удалённая» бд находится рядом):
В версиях 11.2 и ниже факт уникальности имеет значение и план выполнения того же запроса выглядит много приятнее:
— рекурсивный запрос по возможности использует индексный доступ независимо от состояния одного из «удалённых» индексов:
В случае неуникального локального индекса Oracle использует FULL TABLE SCAN удалённых таблиц независимо от версии:
Похоже, что включение в рекурсивный удалённый запрос условий WHERE :1=»L1″ и, как следствие, индексный доступ к таблицам на дальней стороне линка определяется локально используемым методом соединения NESTED LOOPS,
который можно попробовать искусственно форсировать подсказкой USE_NL:
Или при недоступности одного их индексов:
удалённый запрос используется индексный доступ в меру возможностей:
Подсказки JPPD-типа PUSH_PRED(t2) / OLD_PUSH_PRED(t2) с удалённым обзором не срабатывают, хотя механизм OJPPD может работать с удалёнными таблицами (как будет видно далее)
Получается, что индексный доступ (через формирование правильного рекурсивного запроса с условиями) к таблицам, составляющими удалённый UNION ALL обзор выбирается при использовании NESTED LOOPS в качестве способа соединения с данными локальной таблицы:
- в версиях до 12.1 при доступе к локальной таблице по уникальному ключу
- при форсировании использования NESTED LOOPS подсказкой USE_NL
P.S. в качестве альтернативного варианта решения той же задачи логично было бы попробовать использовать локальный обзор для объединения удалённых таблиц:
, однако при недоступности одного из индексов:
— аналогичный тестовому запрос генерирует отличный план, но возвращает ошибку:
— ошибка порождается автоматически сформированным удалённым запросом, и наблюдалась в аналогичных обстоятельствах как минимум с версии 10g (Индекс в статусе unusable, подсказка INDEX и обновлённый RBO в Oracle 11.2), и легко воспроизводится локально в версии 12.1:
— судя по отсутствию курсора в Shared Pool, ошибка возникает на этапе его компиляции и порождается обязательностью к исполнению опасной подсказки INDEX:
Сеть Внимания пирамиды для сегментации сегментации
Сеть Внимания пирамиды для сегментации сегментации Эта статья предлагает сковороду, предлагая функцию модуля привлечения пирамиды (FPA) и Global Module Atterty Upsample (GAU), вводящий очаговый ключ д.
Читайте также: