降低逻辑读优化SQL(转)
来源:互联网 发布:优学院软件下载 编辑:程序博客网 时间:2024/06/05 06:49
问题:
这样一条sql应该怎么优化?
select * from sys_user where user_code = 'zhangyong' or user_code in (select grp_code from sys_grp where sys_grp.user_code = 'zhangyong')Execution Plan----------------------------------------------------------0 SELECT STATEMENT Optimizer=RULE1 0 FILTER2 1 TABLE ACCESS (FULL) OF 'SYS_USER'3 1 INDEX (UNIQUE SCAN) OF 'PK_SYS_GRP' (UNIQUE)Statistics----------------------------------------------------------14 recursive calls4 db block gets30590 consistent gets0 physical reads0 redo size1723 bytes sent via SQL*Net to client425 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)3 rows processed
里面的查询返回的记录数一般只有一两条,但sys_user表的数据很多,怎么样才能让这条sql以sys_grp为驱动表?
表中记录情况如下:
SQL> select count(*) from sys_grp;
COUNT(*)
----------
25130
SQL> select count(*) from sys_user;
COUNT(*)----------15190
优化:
降低逻辑读是优化SQL的基本原则之一
我们尝试通过降低逻辑读来加快SQL的执行.
这里我们使用or展开来改写SQL查询:
select * from sys_user where user_code = 'zhangyong' union allselect * from sys_user where user_code <> 'zhangyong' and user_code in (select grp_code from sys_grp where sys_grp.user_code = 'zhangyong')Statistics---------------------------------------------------------- 0 recursive calls 0 db block gets 130 consistent gets 0 physical reads 0 redo size 1723 bytes sent via SQL*Net to client 425 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 3 rows processedExecution Plan---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=RULE 1 0 UNION-ALL 2 1 TABLE ACCESS (BY INDEX ROWID) OF 'SYS_USER' 3 2 INDEX (UNIQUE SCAN) OF 'PK_SYS_USER' (UNIQUE) 4 1 NESTED LOOPS 5 4 VIEW OF 'VW_NSO_1' 6 5 SORT (UNIQUE) 7 6 TABLE ACCESS (BY INDEX ROWID) OF 'SYS_GRP' 8 7 INDEX (RANGE SCAN) OF 'FK_SYS_USER_CODE' (NON-UNIQUE) 9 4 TABLE ACCESS (BY INDEX ROWID) OF 'SYS_USER' 10 9 INDEX (UNIQUE SCAN) OF 'PK_SYS_USER' (UNIQUE)
我们注意到,通过改写,逻辑读减少到130,从30590到130这是一个巨大的提高,减少逻辑读最终会减少资源消耗,提高SQL的执行效率.
这个改写把Filter改为了Nest LOOP,索引得以充分利用.从而大大提高了性能.
我们同时注意到,这里引入了一个排序
排序来自于这一步:
-----------------------------------------------------------------------------------------
6 5 SORT (UNIQUE)7 6 TABLE ACCESS (BY INDEX ROWID) OF 'SYS_GRP'8 7 INDEX (RANGE SCAN) OF 'FK_SYS_USER_CODE' (NON-UNIQUE)
------------------------------------------------------------------------------------------
在'SYS_GRP'表中,user_code 是非唯一键值
在in值判断里,要做sort unique排序,去除重复值
这里的unionall是不需要排序的
0 0
- 降低逻辑读优化SQL(转)
- spark sql逻辑计划(优化完)转物理计划
- SQL优化--逻辑优化--子查询优化(MySQL)
- SQL逻辑读高的优化
- SQL优化--逻辑优化--非SPJ优化
- SQL优化--逻辑优化--条件化简
- java逻辑转代码,代码逻辑优化
- SQL优化--逻辑优化--视图重写与等价谓词重写
- 一次非典型SQL优化:如何通过业务逻辑优化另辟蹊径?
- WITH AS 优化逻辑读
- [转]简单几步优化Ubuntu 降低CPU使用率
- VLC优化(1) avformat_find_stream_info接口延迟降低
- (转)sql优化
- sql优化(where条件中的''in''在逻辑上相当于............)
- 用类降低业务逻辑复杂度
- spice 优化音频降低cpu
- 优化SQL Server数据逻辑 提高查询性能
- 【SQL优化】条件逻辑判断“case when then”
- 我的面试总结
- ORA-19907: 恢复时间或 SCN 不属于…
- 详细说明函数指针
- ORA-10388: parallel query server…
- 从自动备份中恢复控制文件和SPFILE…
- 降低逻辑读优化SQL(转)
- 单点登录CAS使用记(六):单点登出、单点注销
- Java字符串分割方法split()的功能以及使用方法的详细介绍!
- Kill Session 后寻找该会话的SPID
- 在线购物网站-实验4
- 系统验证与SQLNET.AUTHENTICATION_…
- tomcat 输入localhost:8080显示404 (找不到tomcat主页)
- 使用split命令分割alter日志文件(…
- “ORA-1652: unable to extend temp…