![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
SQL Tuning
文章平均质量分 89
leo0805leo0805
数据
展开
-
2 基数与选择性--优化主题系列
基数与选择性 基数(Cardinality)列唯一键(Distinct_keys)的数量,比如性别,该列只有男女之分,所以这一列基数是2。主键列的基数等于行数。注:NULL值一般不算在基数里面。 选择性(Selectivity)列唯一键(Distinct_Keys)与行数(Num_Rows)的比值。原创 2017-09-22 09:21:00 · 373 阅读 · 0 评论 -
17 全表扫描成本计算--优化主题系列
看执行计划中 COST到底是怎么算出来的 下面探讨下成本计算 很多人在做SQL优化的时候都会去看cost,很多人经常问,为什么cost很小,但是SQL就是跑很久不出结果呢?我在这里告诉大家,做SQL优化的时候不要去看cost,因为这些cost是根据统计信息,根据一些数学算法计算出来的,正是因为cost是基于统计信息,基于数学算法计算出来的,那么一旦统计信息有误差,数学算法有缺陷,那么cost就是错误的,而一旦cost计算错误,那么执行计划很可能就错了。所以我们在做SQL优化的时候不要去看cost。这个原创 2017-10-11 10:35:54 · 373 阅读 · 0 评论 -
19 嵌套循环成本计算--优化主题系列
嵌套循环成本计算(请自己跟着做实验计算一下) select * from v$version where rownum=1; --11.2.0.1.0create table t1 as select object_id id , object_name,owner fromdba_objects;create table t2 as select object_id id , s原创 2017-10-12 12:03:58 · 721 阅读 · 0 评论 -
20 查询变换(subquery unnesting) --优化主题系列
子查询非嵌套(subquery unnesting) 在学习subquery unnesting之前,先深入理解 执行计划中的FILTER,可以这样说,绝大部分复杂的子查询,性能问题基本上都是出现在FILTER上面。现在举个例子解释一下什么是FILTER。(你们要模拟就自己创建一个test表,数据从dba_objects复制)原创 2017-10-13 09:42:33 · 633 阅读 · 0 评论 -
8 访问路径介绍--优化主题系列
访问路径(ACCESS PATH)如table access full、rowid scan、index unique scan、index range scan、index skip scan、index full scan、index fast full scan、index range scan descending、index full scan(min/max)、mat_view rewrite access full等,并将一步步道来。原创 2017-09-29 10:15:57 · 616 阅读 · 0 评论 -
21 视图合并(view merge) --优化主题系列
视图合并(view merge) 当SQL语句中有内联视图(in-line view,内联视图就是在from后面有select子查询)或者SQL语句中有用 create view...创建的视图,CBO会将内联视图/视图给展开,进行等价的改写,这个过程就叫做视图合并。如果没有发生视图合并,在执行计划中,我们可以看到VIEW关键字。原创 2017-10-13 10:28:06 · 3113 阅读 · 0 评论 -
25 union代替or --优化主题系列
当SQL语句中 or条件上面有一个为子查询 这个时候就可以用union代替or或者你发现执行计划中的filter有or 并且or后面跟上子查询EXISTS(select...)的时候就要注意 比如:当然了 当你看到operation中的filter也应该要注意这些看到filter后有orexists(select xx) 则改成union 示例如下(请自己动手实验):原创 2017-10-31 10:47:02 · 472 阅读 · 0 评论 -
26 union代替or-续 --优化主题系列
看了5秒钟 回复哥们说把or展开成union但是那哥们SQL确实太菜了呵呵 只好帮忙写一个了SQL改写之后 执行时间由原来的20秒下降到6秒 逻辑读由804560降低到128422性能还是有很大提升的 到了这里优化还没完 可以创建一个组合索引进一步优化createindex idx on swgl_ddjbxx(fzgs_dm,xjbz,FROMNBGL1);创原创 2017-10-31 10:50:16 · 267 阅读 · 0 评论 -
22 谓词推入(pushing predicate) --优化主题系列
谓词推入(PUSHING PREDICATE) Pushing Predicate(谓词推入):当SQL语句中包含有不能合并的视图,并且视图有谓词过滤(也就是where过滤条件),CBO会将where过滤条件推入视图中,这个就叫做谓词推入。谓词推入的主要目的就是让Oracle尽可能早的过滤掉无用的数据,从而提升查询性能。原创 2017-10-16 16:48:09 · 3557 阅读 · 0 评论 -
23 查看真实基数--优化主题系列
Oracle估算的行数就叫基数??Oracle估算的行数是2967行是真实的还是假的??我们怎么去查看它真实返回多少行呢??原创 2017-10-17 15:35:30 · 285 阅读 · 0 评论 -
18 索引扫描成本计算--优化主题系列
什么时候走索引扫描什么时候走全表扫描今天来彻底搞懂 索引扫描成本计算(请下去自己计算索引扫描的成本)select * from v$version where rownumcreate table t as select * from dba_objects; create index idx_t on t(object_id); BEGIN DBMS_STATS.GA原创 2017-10-12 10:32:37 · 491 阅读 · 0 评论 -
29 超大表与超小表HASH JOIN优化方法--优化主题系列
select * from a,b where a.id=b.id;a表100GB b表50MB 如何优化?? select *,(select * from b wherea.id=b.id) from a; --标量子查询A表100GB 是不是几十亿的数据??如果是标量子查询 A返回一条 B就会扫描1次 相当于B被扫描几十亿次即使B走索引 走索引至少读3个块 然后回表一个原创 2018-01-11 17:53:20 · 2426 阅读 · 0 评论 -
27 分页语句优化--优化主题系列
分页语句 一般都有orderby column desc/asc或者说 分页语句里直接就是where rownum xx一般只返回20行或者50行 一般不会一页显示超过100行 分页语句的优化技巧:1.分页SQL要想快最好走索引根据orderby asc/desc用hintindex_asc/index_desc 强制它走索引INDEXFULL SCAN DES原创 2018-01-08 17:57:40 · 325 阅读 · 0 评论 -
16 反连接(anti-join)--优化主题系列
反连接(anti-join) 反连接其实是特殊的半连接。只是把in/exists换成了not in/not exists执行计划中,看到有 NESTED LOOPS ANTI/HASH JOIN ANTI 就表示有反连接原创 2017-10-11 09:47:17 · 14037 阅读 · 0 评论 -
24 exdata架构探讨--优化主题系列
为什么Oracle做数据库海量数据Oracle为什么有缺陷??Oracle是不是sharedisk架构??rac系统是不是sharedisk架构多个实例用的是共享存储意思就是说存储的I/O吞吐量始终上不去因为Oracle一个进程一次I/O只能读1MB的数据为什么数据仓库要开并行??8个并行那么就是一次读8MB并行不是说你想开多少就多少一个进程要耗费2GB的PGA内存你开8个原创 2017-10-19 17:57:39 · 431 阅读 · 0 评论 -
15 半连接(semi-join)--优化主题系列
半连接(semi-join) 半连接是指两个表/结果集做JOIN,但是只返回某一个表/结果集中的数据。执行计划中,看到有 NESTED LOOPS SEMI/HASH JOIN SEMI 就表示有半连接原创 2017-10-10 17:01:46 · 1022 阅读 · 0 评论 -
1 如何掌握编写一套高质量SQL之本领--优化主题系列
对SQL的编写优化技巧网上资料浩如烟海,也有很好的一些总结性资料,目前总结了以下部分,可供参考。但真正搞懂SQL最优,掌握编写一套高质量SQL之本领,定当要对SQL的执行原理进行深刻的挖掘与剖析。至此,本人将分章节逐步介绍:基数与选择性、直方图、聚簇因子、统计信息、执行计划、访问路径(全表扫描、rowid扫描、索引唯一扫描、索引范围扫描、索引跳跃扫描、索引全扫描、索引快速全扫描等等)、JOIN原创 2017-09-21 17:53:22 · 505 阅读 · 0 评论 -
3 直方图--优化主题系列
直方图当某列数据分布不均衡,为了让CBO能生成最佳的执行计划,我们可能需要对表收集直方图,直方图最大的桶数(Bucket)是254。收集直方图是一个很耗时的过程,如无必要,千万别去收集直方图。原创 2017-09-26 09:07:24 · 437 阅读 · 0 评论 -
4 聚簇因子--优化主题系列
聚簇因子(Clustering Factor) 用来描述一个表中的列是否是规则排序的。原创 2017-09-26 10:10:10 · 303 阅读 · 0 评论 -
5 统计信息--优化主题系列
在OLTP系统中要优化一个SQL语句,首先要保证SQL语句中所有的表统计信息是准确的。如果统计信息都不准确,那么SQL优化就无从谈起。在OLAP系统中,如果数据量特别大,一般不会去收集统计信息,会直接利用HINT把执行计划给固定住。原创 2017-09-28 12:35:45 · 469 阅读 · 0 评论 -
6 执行计划--优化主题系列
在做SQL优化的时候,都必须查看执行计划,看执行计划的时候一定要用SQLPLUS去看,千万不要用PL/SQL DEV/TOAD/EM等工具去看执行计划。因为这些工具只能看到访问路径,无法看到谓词过滤信息,而恰巧,谓词过滤信息是执行计划中的重中之重。可以这样说,如果有谁用PL/SQL DEV/TOAD/EM等工具查看执行计划,那他一定是个SQL优化菜鸟。原创 2017-09-28 12:45:22 · 420 阅读 · 0 评论 -
7 访问路径概述--优化主题系列
访问路径(ACCESSPATH)前面提到过执行计划中的访问路径,访问路径指的是ORACLE通过哪种方式去获取数据,比如通过全部扫描,索引扫描,或者通过ROWID获取数据。下面列举一些常见的访问路径:(注意:我没有完全列举所有的访问路径,只列举了工作中99%见到的) 如tableaccess full、rowidscan、indexunique scan、indexrange s原创 2017-09-29 10:05:56 · 447 阅读 · 0 评论 -
11 哈希连接(HASH JOIN)--优化主题系列
前文提到,嵌套循环只适合输出少量结果集。如果要返回大量结果集(比如返回100W数据),根据嵌套循环算法,被驱动表可能会被扫描100W次,显然这是不对的。看到这里你应该明白为什么有些SQL优化了跑几秒,没优化跑几个小时甚至跑1天都不出结果。返回大量结果集适合走HASH JOIN。HASH JOIN算法非常复杂,这里就不讨论了。原创 2017-10-07 21:12:32 · 1713 阅读 · 0 评论 -
9 join方法--优化主题系列
表(结果集)与表(结果集)之间的连接方式非常重要,如果CBO选择了错误的连接方式,本来几秒就能出结果的SQL可能跑一天都跑不完。如果想要快速定位超大型SQL性能问题,就必须深入理解表连接方式。在多表JOIN的时候,只能是2个表先JOIN,JOIN之后的结果再和其他表/结果集关联,也就是说任何时候都是只能2个表在做JOIN。原创 2017-09-30 09:10:50 · 364 阅读 · 0 评论 -
10 嵌套循环(NESTED LOOP)--优化主题系列
Oracle从较小结果集(驱动表/外部表)中读取一行,然后和较大结果集(被探查表/内部表)中的所有数据逐条进行比较(嵌套循环可以用于非等值连接),如果符合规则,就放入结果集中,然后取较小结果集的下一条数据继续进行循环,直到结束。嵌套循环只适合输出少量结果集或者是用于快速输出结果集。原创 2017-09-30 09:17:33 · 7176 阅读 · 0 评论 -
12 排序合并连接(SORT MERGE JOIN)--优化主题系列
排序合并连接(SORT MERGE JOIN) 前文提到嵌套循环以及哈希连接,他们都有驱动表概念。排序合并连接没有驱动表一说,两个表/行源是对等关系。排序合并连接原理是先对两个表/行源根据JOIN列进行排序(当然了排序的时候要踢出不符合where条件的列),然后再进行连接。排序合并连接可以处理非等值JOIN。有时候,出现了非等值JOIN,还非得走SORT MERGE JOIN不可。根据排序合并的原理,我们知道排序合并连接其实很耗费资源,因为要对2个表/结果集进行排序,所以一般情况下,CBO是不会选择走S原创 2017-10-09 10:30:32 · 9353 阅读 · 0 评论 -
13 笛卡尔积(CARTESIAN)--优化主题系列
当一个SQL中两个表无关联条件,或者关联条件可以被忽略的时候就会发生笛卡尔积。遇到这种情况要仔细分析SQL是否符合需求,是不是SQL写错了。在有些情况下,如果CBO预估两个表返回的行数很少(通常小于10),那么也可能发生笛卡尔积。遇到这样的情况:1.如果SQL跑得很快,并且两个表返回的真实行数确实很少,那么走笛卡尔积可能是最优化 的,这个时候我们不用管。只要是SQL跑得快我们都不用管。2.统计信息不准确导致CBO错误估算,从而引发笛卡尔积连接。这时要更新统计信息。3.CBO计算返回行数错误,导致笛原创 2017-10-09 10:35:17 · 2189 阅读 · 0 评论 -
14 外连接(hash join outer)--优化主题系列
外连接(outer join)外连接有三种,left outer join,right outer join,full outer join。左外连接,左表就做驱动表,右外连接,右表就做驱动表 --在NL的时候 如果走HASH JOIN 没有这个限制如果SQL是用ORACLE的写法 加号的另一边的表做驱动表原创 2017-10-10 16:57:24 · 9732 阅读 · 0 评论 -
28 分析函数优化自连接,减少表访问次数 --优化主题系列
有如下SQL(基于HROracle11gR2):selectemployee_id, first_name, last_name, salary from employees a where salary = (select min(salary) from employees b where b.depa原创 2018-01-10 09:04:27 · 510 阅读 · 0 评论