让有instr的join改走hash
来源:互联网 发布:ray kurzweil 骗 知乎 编辑:程序博客网 时间:2024/05/01 12:59
一QQ群友语句中有条件ON INSTR(B.SCODE,SUBSTR(LTRIM(A.SYMBOL),1,1)) > 0
plan无法走hash
经象群友确认SUBSTR(LTRIM(A.SYMBOL),1,1)) 仅在SCODE中出现一次,于是想到用拆分字符串的方式更改
构建示例如下
DROP TABLE TEST1 PURGE;DROP TABLE test2 PURGE;CREATE TABLE test1 AS SELECT * FROM dba_objects;CREATE TABLE test2 ASSELECT DISTINCT reverse(max(SUBSTR(object_type,1,2))) AS ID,max(object_type) AS object_type FROM TEST1GROUP BY SUBSTR(object_type,1,1);
原方式
SELECT A.OBJECT_NAME, B.OBJECT_TYPE, B.ID FROM TEST1 A INNER JOIN TEST2 B ON INSTR(B.ID, SUBSTR(LTRIM(A.OBJECT_TYPE), 1, 1)) > 0;----------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |----------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 66852 | 6006K| 5255 (2)| 00:01:04 || 1 | NESTED LOOPS | | 66852 | 6006K| 5255 (2)| 00:01:04 || 2 | TABLE ACCESS FULL| TEST2 |18 | 270 | 3 (0)| 00:00:01 ||* 3 | TABLE ACCESS FULL| TEST1 | 3714 | 279K| 292 (2)| 00:00:04 |----------------------------------------------------------------------------
改后语句如下
WITH B AS (SELECT SUBSTR(B.ID, LEVEL, 1) AS ID, B.OBJECT_TYPE FROM TEST2 B CONNECT BY PRIOR ID = ID AND LEVEL <= LENGTH(ID) AND PRIOR DBMS_RANDOM.VALUE() IS NOT NULL)SELECT * FROM TEST1 A INNER JOIN B ON SUBSTR(LTRIM(A.OBJECT_TYPE), 1, 1) = B.ID;----------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |----------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 13370 | 2885K| 299 (3)| 00:00:04 ||* 1 | HASH JOIN | | 13370 | 2885K| 299 (3)| 00:00:04 || 2 | VIEW | | 18 | 252 | 3 (0)| 00:00:01 ||* 3 | CONNECT BY WITHOUT FILTERING| | | | | || 4 | TABLE ACCESS FULL | TEST2 | 18 | 270 | 3 (0)| 00:00:01 || 5 | TABLE ACCESS FULL | TEST1 | 74280 | 14M| 295 (2)| 00:00:04 |----------------------------------------------------------------------------------------
- 让有instr的join改走hash
- 数据分布不均匀走HASH JOIN导致的性能问题
- 虚心接受 坚决不改:三星十亿美元“走自己的路让别人说去”
- 虚心接受 坚决不改:三星十亿美元“走自己的路让别人说去”
- 关于hash join的过程
- 详解Oracle的Hash Join
- hash join的基本机制
- 一次针对Not in的优化--如何让其选择hash join anti
- HASH JOIN
- hash join
- Hash Join
- 浅谈merge join 与hash join的区别
- oracle的表连接hash join、nested loop join
- Oracle 的 hash join连接方式
- Oracle的Hash Join之探究整理
- 错误的选择了HASH JOIN!
- 对Hash Join的一次优化
- 对oracle hash join trace的研究
- LeetCode | Remove Nth Node From End of List
- Ubuntu下安装jdk7u40
- Web编程技术点摘录(三)
- 小for的Cocos2d-x学习笔记与感悟11之文件保存和中文显示
- struts2小结
- 让有instr的join改走hash
- 交叉编译之二:linux环境搭建及下载程序
- android游戏开发系列(2)——背景音乐播放技术
- 找出数组中唯一出现k次的元素x
- CDC和HDC的区别与转换
- 尊重
- THINKPAD F1-F12键盘属性更改
- Struts2结合JFreeChart
- 黑洞数算法