33.读书笔记收获不止Oracle之表连接的排序分析

33.读书笔记收获不止Oracle之表连接的排序分析

                  三种连接方式,哪种会用到排序?

                  哈希连接并不排序,消耗内存是用于建立HASH表。

                  嵌套循环不需要排序。

                  排序合并需要排序。

                  关于哈希连接、排序合并连接,有一个很简单的优化思想:不要取多余的字段参与排序。

1.  排序只取部分字段

1.1      实验1

SQL>alter session set statistics_level=all;

SQL>select /*+leading(t2) use_merge(t1)*/ * from t1,t2 where t1.id=t2.t1_idand t1.n=19;

SQL> select * fromtable(dbms_xplan.display_cursor(null,null,'allstats last'));

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

SQL_ID   dz2rnd44fg2jb,child number 0

-------------------------------------

select /*+leading(t2) use_merge(t1)*/ *from t1,t2 where t1.id=t2.t1_id

and t1.n=19

 

Plan hash value: 1792967693

 

--------------------------------------------------------------------------------

---------------------------------

 

| Id | Operation                      | Name | Starts | E-Rows | A-Rows |   A-Time  | Buf

 

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

fers |       OMem|                  1Mem | Used-Mem |

 

--------------------------------------------------------------------------------

---------------------------------

 

|   0| SELECT STATEMENT    |     |         1 |            |       1 |00:00:00.07 |

1012 |          |        |                     |

 

|   1|  MERGE JOIN            |         |         1 |          1 |         1|00:00:00.07 |

1012 |          |        |                     |

 

 

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

|   2|   SORT JOIN             |         |         1 |       100K|      20|00:00:00.07 |

1005 |     9762K|   1209K| 8677K (0)|

 

|   3|    TABLE ACCESS FULL| T2   |        1 |       100K|    100K|00:00:00.01 |

1005 |          |        |                     |

 

|*  4|   SORT JOIN             |         |        20 |          1 |         1 |00:00:00.01 |

   7|     2048 |     2048 | 2048  (0)|

 

|*  5|    TABLE ACCESS FULL| T1   |        1 |          1 |         1 |00:00:00.01 |

   7 |         |        |                     |

 

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

 

--------------------------------------------------------------------------------

---------------------------------

 

 

Predicate Information (identified byoperation id):

---------------------------------------------------

 

   4- access("T1"."ID"="T2"."T1_ID")

      filter("T1"."ID"="T2"."T1_ID")

   5- filter("T1"."N"=19)

 

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

 

 

25 rows selected.

 

 

 

 

1.2      实验2

SQL>select /*+leading(t2) use_merge(t1)*/ t1.id from t1,t2 wheret1.id=t2.t1_id and t1.n=19;

SQL> select * fromtable(dbms_xplan.display_cursor(null,null,'allstats last'));

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

SQL_ID   8m84q4r08jgrt,child number 0

-------------------------------------

select /*+leading(t2) use_merge(t1)*/ t1.idfrom t1,t2 where

t1.id=t2.t1_id and t1.n=19

 

Plan hash value: 1792967693

 

--------------------------------------------------------------------------------

---------------------------------

 

| Id | Operation                      | Name | Starts | E-Rows | A-Rows |   A-Time  | Buf

 

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

fers |       OMem|                  1Mem | Used-Mem |

 

--------------------------------------------------------------------------------

---------------------------------

 

|   0| SELECT STATEMENT    |     |         1 |            |       1 |00:00:00.08 |

1012 |          |        |                     |

 

|   1|  MERGE JOIN            |         |         1 |          1 |         1 |00:00:00.08 |

1012 |          |        |                     |

 

 

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

|   2|   SORT JOIN             |         |         1 |       100K|      20|00:00:00.08 |

1005 |     2462K|   719K| 2188K (0)|

 

|   3|    TABLE ACCESS FULL| T2   |        1 |       100K|    100K|00:00:00.02 |

1005 |          |        |                     |

 

|*  4|   SORT JOIN             |         |        20 |          1 |         1 |00:00:00.01 |

   7|     2048 |     2048 | 2048  (0)|

 

|*  5|    TABLE ACCESS FULL| T1   |        1 |          1 |         1 |00:00:00.01 |

   7|         |        |                     |

 

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

 

--------------------------------------------------------------------------------

---------------------------------

 

 

Predicate Information (identified byoperation id):

---------------------------------------------------

 

   4- access("T1"."ID"="T2"."T1_ID")

      filter("T1"."ID"="T2"."T1_ID")

   5- filter("T1"."N"=19)

 

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

 

 

25 rows selected.

 

小结:

部分字段排序只用了2188K+2048,全部字段排序使用了8677K+2048.使用部分字段排序使用的资源是要少的。

                  如果表的字段更多一些,PGA空间不够容纳排序区,导致排序在磁盘中进行,性能将会出现数量级下降。很多开发同学用惯了SELECT *,这个一定要注意。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值