Updating deleting predicates oracle

bathroom-blowjob

замечания в Индекс в статусе unusable, подсказка INDEX и обновлённый RBO в Oracle 11.2 «Подсказка ALL_ROWS определяет целью скорейшее выполнение всего запроса с минимальным расходом ресурсов (best throughput при извлечении всего результирующего набора данных).

При одновременном с ALL_ROWS или FIRST_ROWS указании подсказок, определяющих методы доступа к данным (NO_INDEX_SS, INDEX_COMBINE,..) или указывающие методы объединения объектов БД (LEADING, USE_NL_WITH_INDEX,..), оптимизатор отдаёт предпочтение подсказкам методов доступа и объединения» Из документации Oracle 8: «Подсказка FIRST_ROWS определяет стоимостной подход (cost-based approach) для оптимизации блоков запроса (statement block) с целью лучшего времени отклика (response time, минимального расхода ресурсов для возвращения первых строк запроса).

bathroom-blowjob

подсказка указывает оптимизатору Oracle «материализовать» блок запроса (query block), в котором присутствует подсказка, в виде временной таблицы [только] на время выполнения запроса .., подсказка поддерживается даже в текущей версии 11g» 0) 3 select e.ename, from emp_sq e, dept d where d.deptno = e.deptno 4 / ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 3 | 66 | 6 (17)| | 1 | MERGE JOIN | | 3 | 66 | 6 (17)| | 2 | TABLE ACCESS BY INDEX ROWID| DEPT | 4 | 44 | 2 (0)| | 3 | INDEX FULL SCAN | PK_DEPT | 4 | | 1 (0)| |* 4 | SORT JOIN | | 3 | 33 | 4 (25)| |* 5 | TABLE ACCESS FULL | EMP | 3 | 33 | 3 (0)| ----------------------------------------------------------------------------- Statistics ---------------------------------------------------------- 1 recursive calls 10 consistent gets 0 redo size 3 rows processed SQL 0) 3 select e.ename, from emp_sq e, dept d where d.deptno = e.deptno 4 / ------------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ------------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 3 | 93 | 8 (13)| | 1 | TEMP TABLE TRANSFORMATION | | | | | | 2 | LOAD AS SELECT | SYS_TEMP_0FD9D665D_A5677E | | | | |* 3 | TABLE ACCESS FULL | EMP | 3 | 114 | 3 (0)| | 4 | MERGE JOIN | | 3 | 93 | 5 (20)| | 5 | TABLE ACCESS BY INDEX ROWID| DEPT | 4 | 44 | 2 (0)| | 6 | INDEX FULL SCAN | PK_DEPT | 4 | | 1 (0)| |* 7 | SORT JOIN | | 3 | 60 | 3 (34)| | 8 | VIEW | | 3 | 60 | 2 (0)| | 9 | TABLE ACCESS FULL | SYS_TEMP_0FD9D665D_A5677E | 3 | 114 | 2 (0)| ------------------------------------------------------------------------------------------------ Statistics ---------------------------------------------------------- 54 recursive calls 56 consistent gets 572 redo size 3 rows processed select NAME, SQL_FEATURE, CLASS, INVERSE, VERSION from v$sql_hint where name in ('INLINE','MATERIALIZE'); NAME SQL_FEATURE CLASS INVERSE VERSION ------------------------------ ------------------------------ ---------- --------------------------- ------- MATERIALIZE QKSFM_TRANSFORMATION INLINE INLINE 9.0.0 INLINE QKSFM_TRANSFORMATION INLINE MATERIALIZE 9.0.0 Позволяет в случаях, когда Oracle обязан материализовать подзапрос конструкции WITH без подсказок (согласно правилам выполнения subquery factoring, например, когда подзапрос используется в основном запросе в соединениях с малым количеством строк и накладные расходы на создание temporary table, подразумевающее ALL ROWS mode, оказываются больше стоимости нескольких выполнений подзапроса в режиме FIRST ROWS, например, с использованием индексов На примере тестовой схемы можно видеть как применение подсказки уменьшает полную стоимости всего запроса, используя при выполнении одного из подзапросов WITH созданный индекс: (select avg(deptno) from emp_sq) 7 / ------------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ------------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | 37 | 11 (19)| -- стоимость 11 | 1 | TEMP TABLE TRANSFORMATION | | | | | -- Temp Table создаётся без подсказок | 2 | LOAD AS SELECT | SYS_TEMP_0FD9D6665_A5677E | | | | | 3 | HASH GROUP BY | | 3 | 9 | 4 (25)| | 4 | TABLE ACCESS FULL | EMP | 14 | 42 | 3 (0)| |* 5 | HASH JOIN | | 1 | 37 | 5 (20)| | 6 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 11 | 2 (0)| |* 7 | INDEX RANGE SCAN | PK_DEPT | 1 | | 1 (0)| | 8 | SORT AGGREGATE | | 1 | 13 | | | 9 | VIEW | | 3 | 39 | 2 (0)| | 10 | TABLE ACCESS FULL | SYS_TEMP_0FD9D6665_A5677E | 3 | 9 | 2 (0)| | 11 | VIEW | | 3 | 78 | 2 (0)| | 12 | TABLE ACCESS FULL | SYS_TEMP_0FD9D6665_A5677E | 3 | 9 | 2 (0)| ------------------------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 5 - access("D"."DEPTNO"="E"."DEPTNO") 7 - access("D"."DEPTNO" (SELECT AVG("DEPTNO") FROM (SELECT /* CACHE_TEMP_TABLE ("T1") */ "C0" "DEPTNO","C1" "COUNT_BY_DEPT" FROM "SYS"."SYS_TEMP_0FD9D6665_A5677E" "T1") "EMP_SQ")) Statistics ---------------------------------------------------------- 48 recursive calls -- накладные расходы 45 consistent gets -- - неэффективный план 576 redo size -- накладные расходы 1 rows processed SQL (select avg(deptno) from emp_sq) 7 / ------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 23 | 7 (29)| -- меньшая стоимость 7 против 11 | 1 | HASH GROUP BY | | 1 | 23 | 7 (29)| | 2 | NESTED LOOPS | | 1 | 23 | 2 (0)| | 3 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 20 | 2 (0)| |* 4 | INDEX RANGE SCAN | PK_DEPT | 1 | | 1 (0)| | 5 | SORT AGGREGATE | | 1 | 13 | | | 6 | VIEW | | 3 | 39 | 4 (25)| | 7 | SORT GROUP BY | | 3 | 9 | 4 (25)| | 8 | TABLE ACCESS FULL | EMP | 14 | 42 | 3 (0)| |* 9 | INDEX RANGE SCAN | IDX_EMP_DEPTNO | 5 | 15 | 0 (0)| -- индексный доступ ------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 4 - access("D"."DEPTNO" (SELECT AVG("DEPTNO") FROM (SELECT "DEPTNO" "DEPTNO", COUNT(*) "COUNT_BY_DEPT" FROM "EMP" "EMP" GROUP BY "DEPTNO") "EMP_SQ")) 9 - access("D"."DEPTNO"="DEPTNO") Statistics ---------------------------------------------------------- 1 recursive calls -- - накладные расходы 10 consistent gets -- эффективный план 0 redo size -- - накладные расходы 1 rows processed Подсказка недокументирована и может быть использована в боевых условиях только по согласованию с техподдежкой во избежание ORA-00600: [kgl Un Keep Handle] при превышении лимита количества дочерних курсоров По крайней мере с 11.2 подсказка допускает указание блока запроса в форме /* PRECOMPUTE_SUBQUERY(@QB_NAME)*/ Описание механизма - OPTIMIZER_DYNAMIC_SAMPLING При использовании подсказки DYNAMIC_SAMPLING: Если в бд для таблицы имеется [актуальная] статистика по количеству строк,…, оптимизатор использует эту статистику.Соответсвуют (почти) описаниям значений параметра OPTIMIZER_MODE Официально не поддерживается, начиная с Oracle 10, используется оптимизация по точно оределённым правилам (Rule Based Optimization) без учёта статистики объектов бд.Описание применяемых правил для инилизационного параметра optimizer_mode = rule В Oracle 11g R2 введены дополнительные ограничения использования подсказки /* rule*/ В частности, несмотря на использование подсказки RULE Oracle будет использовать Cost-Based Optimization, если: В 11.2 при использовании RBO может формироваться трейс оптимизатора и использоваться некоторые преобразования запросов за исключением Cost-Based Query Transformation (что логично:) — см.дающей оптимизатору больше возможностей в выборе плана выполнения …указывает оптимизатору использовать / не использовать операцию hash join для соединения каждой указанной таблицы с прочими источниками данных Операции CBO: Hash Join Индексный доступ к таблицам удалённого обзора Операции CBO: Nested Loop Join Операции CBO: Sort Merge Join указывают оптимизатору использовать или не использовать вместо классической операции Sort group by относительно «новую» операцию группировки Hash Group By управление использованием механизма Native Full Outer Join использовать для получения результатов запроса временный индекс, получающийся в рез-те объединения существующих индексов методом Index [Hash] Join использовать для получения результатов запроса Bitmap операции с ROWID, полученными при индексном доступе.

bathroom-blowjob

Сравнение 2-х последних методов: Index Join vs Index Bitmap и использование db file parallel read при доступе к блокам таблицы добавлен в версии 10.2 для управления кол-вом индексных ключей, используемых в INLIST ITERATOR с индексом по нескольким полям Bug 5152325 Enh: Add NUM_INDEX_KEYS hint Функционал подсказки исправлен для 11.2.0.3 и зафиксирован в 12.2 — Unresolved quiz: Avoiding in-list iterator «…

--------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 2952 | 279K| 164 (2)| | | 1 | SORT ORDER BY | | 2952 | 279K| 164 (2)| | |* 2 | TABLE ACCESS FULL| T1 | 2952 | 279K| 163 (1)| | --------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter("OBJECT_NAME" LIKE '%#%' AND "OBJECT_NAME" IS NOT NULL AND "OBJECT_ID" 1 6 order by object_id; 30 rows selected.

eliade.ru

97 Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>