Базы данных Oracle - статьи

         

Планы выполнения запросов


Неуклюжесть (отчасти вынужденная) правки текстового индекса компенсируется высокой скоростью обращения к нему при запросах к СУБД. Однако наблюдать план выполнения запроса приходится в этом случае своеобразно. Обычная команда EXPLAIN PLAN много не даст, но обращение к текстовому («прикладному») индексу она отметит:

CTX> EXPLAIN PLAN FOR 2 SELECT * FROM docs 3 WHERE CONTAINS ( vc2doc, 'twinkle AND star' ) > 0;

Explained.

CTX> SELECT * FROM TABLE ( dbms_xplan.display );

PLAN_TABLE_OUTPUT --------------------------------------------------------------------------------------

Plan hash value: 3477406887

-------------------------------------------------------------------------------------- | Id | Operation | Name |Rows|Bytes|Cost (%CPU)|Time | -------------------------------------------------------------------------------------- | 0| SELECT STATEMENT | | 1| 2027| 4 (0)|00:00:01| | 1| TABLE ACCESS BY INDEX ROWID| DOCS | 1| 2027| 4 (0)|00:00:01| |* 2| DOMAIN INDEX | DOCS_VC2DOC_IDX | | | 4 (0)|00:00:01| --------------------------------------------------------------------------------------

Predicate Information (identified by operation id): ---------------------------------------------------

2 - access("CTXSYS"."CONTAINS"("VC2DOC",'twinkle AND star')>0)

Note ----- - dynamic sampling used for this statement

(Форма выдачи плана соответствует версии 10, по которой готовился материал).

Детали отработки самого текстового (не SQL) запроса наблюдаются через специальную таблицу, а не привычную PLAN_TABLE. Создать ее можно примерно так:

CREATE GLOBAL TEMPORARY TABLE ctx_explain ( explain_id VARCHAR2 ( 30 ) , id NUMBER , parent_id NUMBER , operation VARCHAR2 ( 30 ) , options VARCHAR2 ( 30 ) , object_name VARCHAR2 ( 64 ) , position NUMBER , cardinality NUMBER ) ON COMMIT PRESERVE ROWS ;

Просмотр плана для конкретного обращения к конкретному индексу делается через специальную процедуру из системного пакета CTX_QUERY:

BEGIN ctx_query.explain ( index_name => 'docs_vc2doc_idx' , text_query => 'twinkle AND star' , explain_table => 'ctx_explain' , explain_id => 'twinkle star' ); END; /

Пример просмотра сформированного в CTX_EXPLAIN плана обработки текстового запроса:

CTX> SELECT 2 explain_id 3 , id 4 , parent_id 5 , operation 6 , options 7 , object_name 8 , position 9 FROM 10 ctx_explain 11 ORDER BY 12 id 13 /

EXPLAIN_ID ID PARENT_ID OPERATION OPTIONS OBJECT_NAME POSITION -------------- --- ---------- --------- ------- -------------- ---------- twinkle star 1 0 AND 1 twinkle star 2 1 WORD TWINKLE 1 twinkle star 3 1 WORD STAR 2



Содержание раздела