oracle ora 47306,Oracle SQL提示含义与示例 --- 分布式查询和并行提示
《Oracle 高性能SQL引擎剖析:Oracle SQL 優化與調優技術詳解》一書的附錄部分。作為對該書的補充,幫助讀者理解和掌握“提示”這一項在SQL優化中使用的這一重要輔助手段。
語法:DRIVING_SITE([])
描述:指示優化器選擇那個數據庫作為分布式查詢中的驅動站點,即將語句放在該站點上執行。未指定參數時,采用本地數據庫。
HELLODBA.COM>exec sql_explain('select /*+ driving_site(rt) */count(*) from t_tables lt, t_tables@ora11r2 rt where lt.owner = rt.owner and lt.table_name = rt.table_name', 'TYPICAL NOTE');
... ...
Remote SQL Information (identified by operation id):
----------------------------------------------------
3 - SELECT "OWNER","TABLE_NAME" FROM "T_TABLES" "A2" (accessing '!' )
Note
-----
- fully remote statement
語法:REMOTE_MAPPED([])
描述:在分布式查詢中,指示優化器選擇那個數據庫的進行遠程映射。作用和DRIVING_SITE類似。未指定參數時,采用本地數據庫。
HELLODBA.COM>exec sql_explain('select /*+ remote_mapped(ORA11R2) */count(*) from T_USERS@ORA11R2 u, t_tables t where t.owner=u.username', 'TYPICAL');
Remote SQL Information (identified by operation id):
----------------------------------------------------
3 - SELECT "OWNER" FROM "T_TABLES" "A1" (accessing '!' )
Note
-----
- fully remote statement
語法:OPAQUE_TRANSFORM
描述:在分布式查詢中,使用INSERT ... SELECT ... FROM語句從遠程數據庫查詢數據插入本地數據庫時,在遠程數據庫上執行的遞歸查詢語句上會加上該提示,使得分布式數據庫之間的兼容類型數據被透明傳輸。
(本地數據庫,10.2.0.4)
HELLODBA.COM>create table t_objects_dummy2 as select * from t_objects@ora11r2 where 1=2;
Table created.
HELLODBA.COM>exec sql_explain('insert into t_objects_dummy2 select * from t_objects@ora11r2','TYPICAL');
… …
Remote SQL Information (identified by operation id):
----------------------------------------------------
1 - SELECT /*+ OPAQUE_TRANSFORM */ "OWNER","OBJECT_NAME","SUBOBJECT_NAME","OBJECT_I
D","DATA_OBJECT_ID","OBJECT_TYPE","CREATED","LAST_DDL_TIME","TIMESTAMP","STATUS","TEMP
ORARY","GENERATED","SECONDARY","NAMESPACE","EDITION_NAME","LIO" FROM "T_OBJECTS"
"T_OBJECTS" (accessing 'ORA11R2' )
HELLODBA.COM>insert into t_objects_dummy2 select * from t_objects@ora11r2;
72116 rows created.
(遠程數據庫,11.2.0.1)
HELLODBA.COM>select sql_text from v$sqlarea where sql_text like '%OPAQUE_TRANSFORM%' and sql_text not like '%v$sqlarea%';
SQL_TEXT
-------------------------------------------------------------------------------------------------------
SELECT /*+ OPAQUE_TRANSFORM */ "OWNER","OBJECT_NAME","SUBOBJECT_NAME","OBJECT_ID","DATA_OBJECT_ID","OBJECT_TYPE","CREATE
D","LAST_DDL_TIME","TIMESTAMP","STATUS","TEMPORARY","GENERATED","SECONDARY","NAMESPACE","EDITION_NAME","LIO" FROM "T_OBJECTS" "T_OBJECTS"
語法:STATEMENT_QUEUING
描述:在自動并行度模式(11gR2特性)下,使語句在并行資源不足時,進入等待隊列,等到能獲取到資源時繼續運行;
自動并行度模式下,當存在多個并行查詢同時在運行時,如果并行資源不足那么加了該提示的語句就會進入隊列等待,此時,通過監控視圖V$SQL_MONITOR可以看到其狀態為QUEUE。
語法:NO_STATEMENT_QUEUING
描述:在自動并行度模式(11gR2特性)下,即使在并行資源不足時,也繼續運行語句,這就可能會導致其它資源(如CPU)的爭用與等待;
當參數“_parallel_statement_queuing”被設置為TRUE(默認為FALSE),只有加上該提示的語句在并行資源緊張時不會進入隊列。
語法:GBY_PUSHDOWN([])
描述:指示優化器在對并行查詢進行代價估算時,考慮將GROUP BY操作推入并行服務進程的情況;
HELLODBA.COM>exec sql_explain('SELECT /*+ FULL(T) parallel(T DEFAULT) GBY_PUSHDOWN */ owner, table_name, COUNT (status) cnt FROM t_tables t GROUP BY owner, table_name', 'BASIC OUTLINE');
---------------------------------------------
| Id| Operation| Name|
---------------------------------------------
|0 | SELECT STATEMENT||
|1 |PX COORDINATOR ||
|2 |PX SEND QC (RANDOM)| :TQ10001 |
|3 |HASH GROUP BY||
|4 |PX RECEIVE||
|5 |PX SEND HASH| :TQ10000 |
|6 |HASH GROUP BY||
|7 |PX BLOCK ITERATOR ||
|8 |TABLE ACCESS FULL| T_TABLES |
---------------------------------------------
語法:NO_GBY_PUSHDOWN([])
描述:禁止優化器在對并行查詢進行代價估算時,將GROUP BY操作推入并行服務進程;
HELLODBA.COM>exec sql_explain('SELECT /*+ FULL(T) parallel(T DEFAULT) NO_GBY_PUSHDOWN */ owner, table_name, COUNT (status) cnt FROM t_tables t GROUP BY owner, table_name', 'BASIC OUTLINE');
--------------------------------------------
| Id| Operation| Name|
--------------------------------------------
|0 | SELECT STATEMENT||
|1 |PX COORDINATOR||
|2 |PX SEND QC (RANDOM)| :TQ10001 |
|3 |HASH GROUP BY||
|4 |PX RECEIVE||
|5 |PX SEND HASH| :TQ10000 |
|6 |PX BLOCK ITERATOR ||
|7 |TABLE ACCESS FULL| T_TABLES |
--------------------------------------------
語法:HWM_BROKERED
描述:提示語句執行器在執行并行插入數據(或從其它表獲取數據創建新表)時,使用高水位線查封器拆分高水位線,使得多個并行服務進程能共用一個擴展段。
示例(9i):
HELLODBA.COM>alter session enable parallel dml;
Session altered.
HELLODBA.COM>explain plan for insert /*+ append */ into t_objects_dummy select /*+ full(o) parallel(o 2)*/* from t_objects o;
Explained.
HELLODBA.COM>select plan_table_output from table(dbms_xplan.display(null, null, 'ALL'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------
| Id| Operation|Name| Rows| Bytes | Cost|TQ|IN-OUT| PQ Distrib |
-------------------------------------------------------------------------------------------------
|0 | INSERT STATEMENT|| 32435 |2945K|22 ||||
|1 |LOAD AS SELECT||||||||
|2 |TABLE ACCESS FULL| T_OBJECTS| 32435 |2945K|22 | 63,00| P->S | QC (RAND)|
-------------------------------------------------------------------------------------------------
HELLODBA.COM>explain plan for insert /*+ append HWM_BROKERED */ into t_objects_dummy select /*+ full(o) parallel(o 2)*/* from t_objects o;
Explained.
HELLODBA.COM>select plan_table_output from table(dbms_xplan.display(null, null, 'ALL'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------
| Id| Operation|Name| Rows| Bytes | Cost|TQ|IN-OUT| PQ Distrib |
-------------------------------------------------------------------------------------------------
|0 | INSERT STATEMENT|| 32435 |2945K|22 ||||
|1 |LOAD AS SELECT||||||||
|2 |TABLE ACCESS FULL| T_OBJECTS| 32435 |2945K|22 | 64,00| P->S | QC (RAND)|
|2 |TABLE ACCESS FULL| T_OBJECTS| 32435 |2945K|22 | 63,00| P->S | QC (RAND)|
|1 |LOAD AS SELECT||||||||
|2 |TABLE ACCESS FULL| T_OBJECTS| 32435 |2945K|22 | 64,00| P->S | QC (RAND)|
|2 |TABLE ACCESS FULL| T_OBJECTS| 32435 |2945K|22 | 63,00| P->S | QC (RAND)|
|0 | INSERT STATEMENT|| 32435 |2945K|22 ||||
|1 |LOAD AS SELECT||||||||
|2 |TABLE ACCESS FULL| T_OBJECTS| 32435 |2945K|22 | 64,00| P->S | QC (RAND)|
|2 |TABLE ACCESS FULL| T_OBJECTS| 32435 |2945K|22 | 63,00| P->S | QC (RAND)|
|1 |LOAD AS SELECT||||||||
|2 |TABLE ACCESS FULL| T_OBJECTS| 32435 |2945K|22 | 64,00| P->S | QC (RAND)|
|2 |TABLE ACCESS FULL| T_OBJECTS| 32435 |2945K|22 | 63,00| P->S | QC (RAND)|
-------------------------------------------------------------------------------------------------
語法:NO_QKN_BUFF
描述:禁止優化器使用動態分配的內存
HELLODBA.COM>exec sql_explain('select /*+parallel(t 8) parallel(o 8) leading(t o) pq_distribute(o hash hash) NO_QKN_BUFF*/* from t_tables t, t_objects o where t.owner=o.owner and t.table_name=o.object_name and o.status=:A','BASIC');
---------------------------------------------
| Id| Operation| Name|
---------------------------------------------
|0 | SELECT STATEMENT||
|1 |PX COORDINATOR||
|2 |PX SEND QC (RANDOM)| :TQ10002|
|3 |HASH JOIN||
|4 |PX RECEIVE||
|5 |PX SEND HASH| :TQ10000|
|6 |PX BLOCK ITERATOR ||
|7 |TABLE ACCESS FULL| T_TABLES|
|8 |PX RECEIVE||
|9 |PX SEND HASH| :TQ10001|
|10 |PX BLOCK ITERATOR ||
|11 |TABLE ACCESS FULL| T_OBJECTS |
---------------------------------------------
語法:PARALLEL_INDEX([查詢塊] [ ...] )或者PARALLEL_INDEX([查詢塊] () [() ...] )
描述:指示優化器選擇并行方式訪問本地分區索引。并行度可以為數字,也可以為DEFAULT,使用系統默認并行度。
HELLODBA.COM>exec sql_explain('select /*+ qb_name(M) parallel_index(o t_objects_list_IDX1 2) */* from t_objects_list o where object_name like :A', 'BASIC');
--------------------------------------------------------------------
| Id| Operation| Name|
--------------------------------------------------------------------
|0 | SELECT STATEMENT||
|1 |PX COORDINATOR||
|2 |PX SEND QC (RANDOM)| :TQ10000|
|3 |PX PARTITION LIST ALL||
|4 |TABLE ACCESS BY LOCAL INDEX ROWID| T_OBJECTS_LIST|
|5 |INDEX RANGE SCAN| T_OBJECTS_LIST_IDX1 |
--------------------------------------------------------------------
語法:NO_PARALLEL_INDEX([查詢塊] [ ...])或者NO_PARALLEL_INDEX([查詢塊] () [() ...])
描述:禁止優化器選擇并行方式訪問本地分區索引
HELLODBA.COM>alter index t_objects_list_IDX1 parallel(degree 2);
Index altered.
HELLODBA.COM>exec sql_explain('select /*+ qb_name(M) no_parallel_index(o t_objects_list_IDX1)*/* from t_objects_list o where object_name like :A', 'BASIC');
------------------------------------------------------------------
| Id| Operation| Name|
------------------------------------------------------------------
|0 | SELECT STATEMENT||
|1 |PARTITION LIST ALL||
|2 |TABLE ACCESS BY LOCAL INDEX ROWID| T_OBJECTS_LIST|
|3 |INDEX RANGE SCAN| T_OBJECTS_LIST_IDX1 |
------------------------------------------------------------------
語法:PQ_DISTRIBUTE([] )或者PQ_DISTRIBUTE([] )
描述:指定并行查詢中并行收、發進程直接的分發方式;
HELLODBA.COM>exec sql_explain('select /*+parallel(o 2)*/* from t_objects o where exists (select /*+hash_sj PQ_DISTRIBUTE(t HASH HASH)*/1 from t_tables t where o.owner = t.owner and o.object_name = t.table_name)', 'BASIC');
-------------------------------------------------------
| Id| Operation| Name|
-------------------------------------------------------
|0 | SELECT STATEMENT||
|1 |PX COORDINATOR||
|2 |PX SEND QC (RANDOM)| :TQ10002|
|3 |HASH JOIN RIGHT SEMI BUFFERED||
|4 |BUFFER SORT||
|5 |PX RECEIVE||
|6 |PX SEND HASH| :TQ10000|
|7 |INDEX FULL SCAN| T_TABLES_PK |
|8 |PX RECEIVE||
|9 |PX SEND HASH| :TQ10001|
|10 |PX BLOCK ITERATOR||
|11 |TABLE ACCESS FULL| T_OBJECTS|
-------------------------------------------------------
語法:PARALLE([[] ] [])
描述:指示優化器對查詢塊或者對象使用并行查詢。其中,當中指定整條語句為并行查詢(未指定查詢塊和表)時,并行度可以為MANUAL,AUTO,DEFAULT或者指定數字;指定某個表時,并行度可以為DEFAULT或者指定數字,
HELLODBA.COM>exec sql_explain('SELECT /*+ parallel(u default) */* from t_users u', 'BASIC');
-----------------------------------------
| Id| Operation| Name|
-----------------------------------------
|0 | SELECT STATEMENT||
|1 |PX COORDINATOR||
|2 |PX SEND QC (RANDOM)| :TQ10000 |
|3 |PX BLOCK ITERATOR ||
|4 |TABLE ACCESS FULL| T_USERS|
-----------------------------------------
語法:NO_PARALLEL()
描述:禁止優化器并行查詢表
HELLODBA.COM>alter table t_objects_dummy parallel(degree 2);
Table altered.
HELLODBA.COM>exec sql_explain('SELECT /*+ no_parallel */* from t_objects_dummy o', 'BASIC');
Plan hash value: 2093122083
---------------------------------------------
| Id| Operation| Name|
---------------------------------------------
|0 | SELECT STATEMENT||
|1 |TABLE ACCESS FULL| T_OBJECTS_DUMMY |
---------------------------------------------
語法:SHARED( [并行度])
描述:指示優化器共享指定表的并行度。如果指定并行度,則和PARALLEL提示作用相同。
HELLODBA.COM>alter table t_objects_dummy parallel(degree 2);
Table altered.
HELLODBA.COM>alter table t_objects parallel(degree 8);
Table altered.
HELLODBA.COM>exec sql_explain('select /*+ full(o) full(d) shared(d) */count(*) from t_objects_dummy d, t_objects o where o.owner=d.owner and o.object_name = d.object_name', 'BASIC COST');
------------------------------------------------------------------
| Id| Operation| Name| Cost (%CPU)|
------------------------------------------------------------------
|0 | SELECT STATEMENT||719(1)|
|1 |SORT AGGREGATE|||
|2 |PX COORDINATOR|||
|3 |PX SEND QC (RANDOM)| :TQ10002||
|4 |SORT AGGREGATE|||
| 5 |HASH JOIN||719(1)|
|6 |PX RECEIVE||231(0)|
|7 |PX SEND HASH| :TQ10000|231(0)|
|8 |PX BLOCK ITERATOR ||231(0)|
|9 |TABLE ACCESS FULL| T_OBJECTS|231(0)|
|10 |PX RECEIVE||486(0)|
|11 |PX SEND HASH| :TQ10001|486(0)|
|12 |PX BLOCK ITERATOR ||486(0)|
|13 |TABLE ACCESS FULL| T_OBJECTS_DUMMY |486(0)|
------------------------------------------------------------------
HELLODBA.COM>exec sql_explain('select /*+ full(o) full(d) shared(o) */count(*) from t_objects_dummy d, t_objects o where o.owner=d.owner and o.object_name = d.object_name', 'BASIC COST');
------------------------------------------------------------------
| Id| Operation| Name| Cost (%CPU)|
------------------------------------------------------------------
|0 | SELECT STATEMENT||1437(1)|
|1 |SORT AGGREGATE|||
|2 |PX COORDINATOR|||
|3 |PX SEND QC (RANDOM)| :TQ10002||
|4 |SORT AGGREGATE|||
|5 |HASH JOIN||1437(1)|
|6 |PX RECEIVE||463(1)|
|7 | PX SEND HASH| :TQ10000|463(1)|
|8 |PX BLOCK ITERATOR ||463(1)|
|9 |TABLE ACCESS FULL| T_OBJECTS|463(1)|
|10 |PX RECEIVE||973(1)|
|11 |PX SEND HASH| :TQ10001|973(1)|
|12 |PX BLOCK ITERATOR ||973(1)|
|13 |TABLE ACCESS FULL| T_OBJECTS_DUMMY |973(1)|
------------------------------------------------------------------
語法:NOPARALLEL([[] ])
描述:禁止優化器對查詢塊或者對象使用并行查詢。和NO_PARALLEL作用基本相同。
參見NO_PARALLEL示例。
語法:PQ_MAP()
描述:未知。可能是用于并行查詢的提示。
語法:PQ_NOMAP()
描述:未知。可能是用于并行查詢的提示。
語法:PRESERVE_OID
描述:未知。可能是用于并行查詢的提示。
語法:SYS_PARALLEL_TXN
描述:未知。可能是用于并行查詢的遞歸調用語句上的。
語法:CUBE_GB
描述:未知。可能是用于GROUP BY CUBE并行查詢的內部遞歸查詢
該提示直接使用會導致10g(10.2.0.4)在解析提示時在后臺發生ORA-00600錯誤,但不會終止語句運行。
ORA-600: internal error code, arguments: [prsHintQbLevel-1], [890], [], [], [], [], [], []
發生類似情況的提示還有:CUBE_GB/GBY_CONC_ROLLUP/PIV_GB/PIV_SSF/RESTORE_AS_INTERVALS/SAVE_AS_INTERVALS/SCN_ASCENDING/MODEL_DONTVERIFY_UNIQUENESS/TIV_GB/TIV_SSF
語法:GBY_CONC_ROLLUP
描述:未知。可能是用于GROUP BY ROLLUP并行查詢的內部遞歸查詢
語法:PIV_GB
描述:未知。出現在GROUP BY并行查詢的內部遞歸查詢語句上
示例(9i):
HELLODBA.COM>select /*+qb_name(Q2) full(o2) parallel(o2 2)*/ owner, status, count(object_name) from t_objects o2 where owner like 'D%' group by owner, status;
Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=CHOOSE (Cost=11 Card=3 Bytes=42)
10SORT* (GROUP BY) (Cost=11 Card=3 Bytes=42):Q17865001
21SORT* (GROUP BY) (Cost=11 Card=3 Bytes=42):Q17865000
32TABLE ACCESS* (FULL) OF 'T_OBJECTS' (Cost=6 Card=3379 Bytes=47306):Q17865000
1 PARALLEL_TO_SERIALSELECT /*+ CIV_GB */ A1.C0,A1.C1,COUNT(SYS_O
P_CSR(A1.C2,0)) FROM :Q17865000 A1 GROUP BY
A1.C0,A1.C1
2 PARALLEL_TO_PARALLELSELECT /*+ PIV_GB */ A1.C0 C0,A1.C1 C1,SYS_O
P_MSR(COUNT(*)) C2 FROM (SELECT /*+ NO_EXPAN
D ROWID(A2) */ A2."OWNER" C0,A2."STATUS" C1
FROM "T_OBJECTS" PX_GRANULE(0, BLOCK_RANGE,
DYNAMIC)A2 WHERE A2."OWNER" LIKE 'D%') A1
GROUP BY A1.C0,A1.C1
3 PARALLEL_COMBINED_WITH_PARENT
語法:TIV_GB
描述:未知。出現在并行查詢的內部遞歸查詢語句上
語法:TIV_SSF
描述:未知。出現在并行查詢的內部遞歸查詢語句上
語法:PIV_SSF
描述:未知。出現在并行查詢的內部遞歸查詢語句上
語法:RESTORE_AS_INTERVALS
描述:未知。出現在并行查詢的內部遞歸查詢語句上
語法:SAVE_AS_INTERVALS
描述:未知。出現在并行查詢的內部遞歸查詢語句上
語法:SCN_ASCENDING
描述:未知。出現在并行查詢的內部遞歸查詢語句上
總結
以上是生活随笔為你收集整理的oracle ora 47306,Oracle SQL提示含义与示例 --- 分布式查询和并行提示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android代码打开数据库,andro
- 下一篇: linux 管道交互,Linux C:具