592- 使用的Hint 无效-续

本文探讨了SQL查询中并行访问的使用及其优化,包括hint的正确应用与理解,以及并行访问如何影响查询执行计划。通过实例分析,展示了如何通过合理设置并行访问参数来提高查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL> drop index IDX_DEPT_CP_LOC;

Index dropped.---索引都删了,hint 当然失效。

SQL> select /*+ index(dept_cp IDX_DEPT_CP_LOC) */ deptno,dname from dept_cp where loc='CHICAGO';

Execution Plan
----------------------------------------------------------
Plan hash value: 4265608153

-----------------------------------------------------------------------------
| Id  | Operation  | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |    |  1 | 20 |  3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| DEPT_CP |  1 | 20 |  3   (0)| 00:00:01 |
-----------------------------------------------------------------------------

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

   1 - filter("LOC"='CHICAGO')

SQL> 
SQL> select * from dept_cp;

Execution Plan
----------------------------------------------------------
Plan hash value: 4265608153

-----------------------------------------------------------------------------
| Id  | Operation  | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |    |  4 | 80 |  3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| DEPT_CP |  4 | 80 |  3   (0)| 00:00:01 |
-----------------------------------------------------------------------------

SQL>

SQL> select /*+ parallel(dept_cp 2) */* from dept_cp d;--错误的hint,表有别名 必须要用!!!

Execution Plan
----------------------------------------------------------
Plan hash value: 4265608153

-----------------------------------------------------------------------------
| Id  | Operation  | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |    |  4 | 80 |  3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| DEPT_CP |  4 | 80 |  3   (0)| 00:00:01 |
-----------------------------------------------------------------------------

SQL> set lines 300
SQL> select /*+ parallel(d 2) */* from dept_cp d;--并行访问。

Execution Plan
----------------------------------------------------------
Plan hash value: 1553418115

--------------------------------------------------------------------------------------------------------------
| Id  | Operation     | Name | Rows | Bytes | Cost (%CPU)| Time |    TQ  |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     | |     4 |    80 |     2   (0)| 00:00:01 | | |     |
|   1 |  PX COORDINATOR      | | | |     | | | |     |
|   2 |   PX SEND QC (RANDOM)| :TQ10000 |     4 |    80 |     2   (0)| 00:00:01 |  Q1,00 | P->S | QC (RAND)  |
|   3 |    PX BLOCK ITERATOR | |     4 |    80 |     2   (0)| 00:00:01 |  Q1,00 | PCWC |     |
|   4 |     TABLE ACCESS FULL| DEPT_CP |     4 |    80 |     2   (0)| 00:00:01 |  Q1,00 | PCWP |     |
--------------------------------------------------------------------------------------------------------------

SQL> select * from dept_cp;

Execution Plan
----------------------------------------------------------
Plan hash value: 4265608153

-----------------------------------------------------------------------------
| Id  | Operation  | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |    |  4 | 80 |  3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| DEPT_CP |  4 | 80 |  3   (0)| 00:00:01 |
-----------------------------------------------------------------------------

SQL> 

===============================================================================================

SQL> select /*+ index(dept_cp PK_DEPT_CP) parallel(dept_cp 2) */deptno from dept_cp;

Execution Plan
----------------------------------------------------------
Plan hash value: 1553418115

--------------------------------------------------------------------------------------------------------------
| Id  | Operation     | Name | Rows | Bytes | Cost (%CPU)| Time |    TQ  |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     | |     4 |    12 |     2   (0)| 00:00:01 | | |     |
|   1 |  PX COORDINATOR      | | | |     | | | |     |
|   2 |   PX SEND QC (RANDOM)| :TQ10000 |     4 |    12 |     2   (0)| 00:00:01 |  Q1,00 | P->S | QC (RAND)  |
|   3 |    PX BLOCK ITERATOR | |     4 |    12 |     2   (0)| 00:00:01 |  Q1,00 | PCWC |     |
|   4 |     TABLE ACCESS FULL|
DEPT_CP |     4 |    12 |     2   (0)| 00:00:01 |  Q1,00 | PCWP |     |
--------------------------------------------------------------------------------------------------------------
--由此可见上面这个hint是“错误的”,或者说不是预期的组合hint没有都执行。
SQL> select /*+ index(dept  PK_DEPT) parallel(dept 2) */deptno from dept;

Execution Plan
----------------------------------------------------------
Plan hash value: 2913917002

----------------------------------------------------------------------------
| Id  | Operation | Name    | Rows  | Bytes | Cost (%CPU)| Time   |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT |   | 4 | 12 | 1   (0)| 00:00:01 |
|   1 |  INDEX FULL SCAN | PK_DEPT | 4 | 12 | 1   (0)| 00:00:01 |
----------------------------------------------------------------------------

SQL> select t.INDEX_NAME,t.TABLE_NAME,t.COLUMN_NAME,i.index_type from user_ind_columns t,user_indexes i where t.index_name = i.index_name 

order by t.TABLE_NAME;

INDEX_NAME     TABLE_NAME      COLUMN_NAME     INDEX_TYPE
-------------------- --------------- --------------- ---------------------------
PK_DEPT          DEPT          DEPTNO     NORMAL

PK_DEPT_CP     DEPT_CP     DEPTNO     NORMAL


SQL> desc DEPT
 Name       Null? Type
 ----------------------------------------------------- -------- ------------------------------------
 DEPTNO       NOT NULL NUMBER(2)
 DNAME     VARCHAR2(14)
 LOC     VARCHAR2(13)


SQL> desc DEPT_CP
 Name       Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 DEPTNO     NUMBER(2)
 DNAME       NOT NULL VARCHAR2(14)
 LOC     VARCHAR2(13)

--可以发现,dept_cp 只是建立了索引,但是没有建立主键.
SQL> alter table dept_cp modify(deptno not null);

Table altered.

SQL> select /*+ index(dept_cp PK_DEPT_CP) parallel(dept_cp 2) */deptno from dept_cp;

Execution Plan
----------------------------------------------------------
Plan hash value: 637767428

-------------------------------------------------------------------------------
| Id  | Operation | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     4 |    12 |     1 (0)| 00:00:01 |
|   1 |  INDEX FULL SCAN | PK_DEPT_CP |     4 |    12 |     1 (0)| 00:00:01 |
-------------------------------------------------------------------------------

--由此可见上面这个hint是“错误的”,或者说不是预期的组合hint没有都执行。

可以看到,执行计划走得是dept 上索引PK_DEPT_CP 的索引全扫描,但是这里是串行执行的。

parallel (dept_cp 2)失效了,因为PK_DEPT_CP 并不是分区索引,而对于非分区索引而言,索引

范围扫描或者索引全扫描都不可能并行执行。
----------------------------------------------------------------------------------------------------------------------------------

-----------------------------------------------下面这两个差在哪里--------------------------------------------------------

SQL> select /*+ index(d PK_DEPT_CP) parallel(d 2) */  *  from dept_cp d;

Execution Plan
----------------------------------------------------------
Plan hash value: 2095782048

------------------------------------------------------------------------------------------
| Id  | Operation    | Name | Rows  | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    | |     4 |    80 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| DEPT_CP |     4 |    80 |     2   (0)| 00:00:01 |
|   2 |   INDEX FULL SCAN    | PK_DEPT_CP |     4 | |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------------

SQL> select /*+ index(d PK_DEPT_CP) parallel(d 2) */deptno from dept_cp d;

Execution Plan
----------------------------------------------------------
Plan hash value: 637767428

-------------------------------------------------------------------------------
| Id  | Operation | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     4 |    12 |     1 (0)| 00:00:01 |
|   1 |  INDEX FULL SCAN | PK_DEPT_CP |     4 |    12 |     1 (0)| 00:00:01 |
-------------------------------------------------------------------------------

SQL>

 截图如下


 select /*+ use_hash(e) */e.empno,e.ename,d.loc from emp_sys e,dept_sys d where e.deptno=d.deptno and d.loc='CHICAGO'; ---未完待续







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

5icode.top

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值