sql 查询优化
文章平均质量分 81
3
优惠券已抵扣
余额抵扣
还需支付
¥39.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
scan724
这个作者很懒,什么都没留下…
展开
-
关于逻辑读问题
arraysize规定了每次读返回多少rows,但是读是发生在block中的,而不是row上。所以由于arraysize的存在,使得很多block必须重复多读一次。所以调整arraysize的大小,不同程度上影响了逻辑读的性能SQL> create table test(id int,name char(10));Table created.SQL> begin原创 2014-01-16 09:38:53 · 711 阅读 · 0 评论 -
影响子查询展开的情况
限制子查询展开情况1(rownum):SQL>select ename, deptno from emp where deptno in (select deptno from dept where dname = 'SALES' ); 2 3 4原创 2014-01-09 11:14:01 · 839 阅读 · 0 评论 -
全表扫描
TABLE ACCESS FULL 全表扫描,多块读,等待事件:db file scattered read 如果是并行全表扫描,等待事件: direct path read 11g 有个新特征,在进行全表扫描的时候也会产生 direct path read 在OLTP环境中要通过原创 2014-01-26 20:04:49 · 732 阅读 · 0 评论 -
index unique scan
INDEX UNIQUE SCAN 索引唯一扫描。单块读 只可能发生在unique index/primary key 等值查找 等待事件:db file sequential read 但是你几乎看不到,因为只读一条数据 HINT 无需指定,有索引会自动走INDEX UNIQUE SCAN唯一索引等值原创 2014-01-26 20:29:17 · 1350 阅读 · 0 评论 -
什么情况下发生单块读?
什么情况下会发生 db file sequential read?单块读发生在磁盘读入到内存里1.走索引扫描是单块读 除INDEX FAST FULL SCAN外2.为扫描行迁移 行连接是单块读?因为物理上不连续3.从UNDO读数据也是单块读4.读 块头segment_header也是单块读5.读位图管理块是单块读 为什么Oracle要避原创 2014-01-26 19:51:24 · 768 阅读 · 0 评论 -
绑定变量窥探和直方图
绑定变量窥视cbo的一个附属功能,关闭他不会影响是用cbo还是rbo,就算关闭了绑定变量窥视,cbo还是会利用别的统计信息(num_distinct,density等)来评估cost和cardinality,只是无法使用直方图信息而已:SQL> SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ FROM原创 2014-01-18 21:52:19 · 1779 阅读 · 0 评论 -
index rang scan
根:分支的范围,范围块的地址----- begin tree dumpbranch: 0x1000c93 16780435 (0: nrow: 5, level: 1) leaf: 0x1000c94 16780436 (-1: nrow: 485 rrow: 485) leaf: 0x1000c95 16780437 (0: nrow: 479 rrow: 479)原创 2014-01-26 20:46:54 · 766 阅读 · 0 评论 -
Hash unique和Sort unique
SQL> set linesize 200SQL> set pagesize 200SQL> set autot traceSQL> select distinct department_name from hr.departments dept, hr.employees emp where dept.department_id = emp.department_id;原创 2014-02-21 13:44:23 · 3931 阅读 · 0 评论 -
分页SQL优化
SELECT * FROM (SELECT pubformdat0_.id id332_, pubformdat0_.domain_id domain2_332_, pubformdat0_.process_id process3_332_, pubformdat0_.entity_id entity4_332原创 2014-01-03 20:34:10 · 715 阅读 · 0 评论 -
BITMAP CONVERSION FROM ROWIDS
示例如下(请自己动手实验):create table test1 as select * from dba_objects;create table test2 as select * from dba_objects;create index idx1 on test1(object_id);create index idx2 on test1(owner);create原创 2014-02-25 11:16:21 · 810 阅读 · 0 评论 -
Buffer Sort
BUFFER (SORT)DescriptionPerforms a memory sort on a row source CREATE TABLE t1 (c01 NUMBER); CREATE INDEX T1_C1 ON T1(C01);CREATE TABLE t2 (c02 NUMBER); BEGIN DBMS_STATS.GA原创 2014-02-13 14:00:12 · 771 阅读 · 0 评论 -
union 代替or的情况
技巧2:union 代替or的情况当SQL语句中,or 条件上面有一个为子查询,并且子查询上的表与源表不同,这个时候就可以用union代替or或者你发现执行计划中的 filter 有 or 并且 or 后面跟上子查询(EXISTS...)的时候就要注意,比如:2 - filter("T"."LRR_DM"='e90e3fe4237c4af988477329c7f2059e'原创 2014-02-25 11:29:46 · 1962 阅读 · 0 评论 -
分页SQL技术1-COUNT STOPKEY.
条件有rownum的时候出现扫描表,到前n行停止原创 2014-02-25 21:37:20 · 808 阅读 · 0 评论 -
SORT ORDER BY STOPKEY
select * from (select * from (select a.*,rownum rn from page a where object_id >1000 and owner='SYS' order by object_id desc) where rownum<=20) where rn>=20;现在加个HINTSQ原创 2014-02-26 12:41:53 · 1301 阅读 · 0 评论 -
分页SQL取下一页
20条记录一页,扫描第2页就需要访问40条记录。SQL> select * from ( select * from ( select /*+ index_desc(a idx_page_3) */ a.*,rownum rn from pagea where object_id >1000 and owner='SYS' order by object_id desc ) w原创 2014-02-26 13:25:15 · 691 阅读 · 0 评论 -
利用函数索引优化<>
SQL> select count(*),ID from test_2 group by id; COUNT(*) ID---------- ---------- 131072 1 1179648 2select count(*) from test_2 where id <>2;------利用函数索引优化:select co原创 2014-02-26 20:44:59 · 565 阅读 · 0 评论 -
索引的结构图
一个叶子块存放多条数据,通过rowid指向数据块原创 2014-02-26 21:26:51 · 890 阅读 · 0 评论 -
分页SQL模板
select * from ( select rownum as rn ,a.* from ( select* from page a where object_id >1000 and owner='SYS'order by object_id desc )a where rownum=21原创 2014-03-01 19:53:02 · 565 阅读 · 0 评论 -
全表扫描分页
SQL> set linesize 200SQL> set pagesize 200SQL> alter session set statistics_level=all; Session altered.SQL> select * from ( select rownum as rn ,a.* from ( select* from page a )a whe原创 2014-03-01 19:48:10 · 874 阅读 · 0 评论 -
OLAP 大表和小表并行hash join
一个表50MB 一个表10GB 50M表做驱动表,放在PGA里这时候慢在对对 10g 的全表扫描对10个G扫描块 需要开并行我有这样一个算法 一个进程 读 50mb 8进程 来 扫描 10gb 一个 进程扫描 1.25gb 50MB 都分发到 8个进程超大表和小表之间做HASH JOIN,一般会启用用并原创 2014-03-01 20:15:35 · 1561 阅读 · 0 评论 -
关于打开游标的那些事
----------------------------------------------------------------------SQL> begin 2 for i in 1 .. 50000 3 loop 4 insert into t1 values(i,'a'); 5 commit; 6 end loop; 7 end;原创 2014-03-06 10:24:14 · 721 阅读 · 0 评论 -
利用ordered hints优化SQL
SQL_ID 4g70n3k9bqc5v, child number 0-------------------------------------MERGE INTO YJBZH_GRXDFHZMXJL GRXDFHZMXJL USING ( SELECT A.AGMT_ID AS AGMT_ID, B.CUST_NAME AS CUST_NAME FROM DWF.F_AGT_CA原创 2014-03-12 13:03:17 · 862 阅读 · 1 评论 -
再次遭遇笛卡尔积
改为MERGE /*+ordered*/ INTO YJBZH_GRXDFHZMXJL GRXDFHZMXJL USING ( SELECT A.AGMT_ID AS AGMT_ID, B.CUST_NAME AS CUST_NAME FROM DWF.F_AGT_CADB_BOOK_H A, DWF.F_AGT_SAVB_BASICINFO_H B WHERE A.START_DT原创 2014-03-13 11:30:47 · 750 阅读 · 0 评论 -
类似NL的update更新
update b set b.object_name=(select a.object_name from a where a.object_id=b.object_id);create table a as (select * from (select * from dba_objects order by object_id) where rownum<100)create原创 2014-03-09 21:19:10 · 653 阅读 · 0 评论 -
WITH AS and materialize hints
WITH AS: 就是将一个子查询部分独立出来,有时候是为了提高SQL语句的可读性,有时候是为了提高SQL语句性能。 如果一个SQL语句中,某个表会被访问多次,而且每次访问的限制条件一样的话,就可以使用with as来提高性能。 注意:如果 with as 短语没有被调用2次以上,CBO就不会讲这个短语获取的数据放入temp表,如果想要讲数据放入temp原创 2013-12-30 22:18:21 · 1564 阅读 · 0 评论 -
全表扫描引发的db file sequential read
今天我要做一个SQL调优,监控该SQL, 利用ASH 监控 该SQL是在sid=4848 上面跑的 SQL> select SESSION_ID,NAME,P1,P2,P3,WAIT_TIME,CURRENT_OBJ#,CURRENT_FILE#,CURRENT_BLOCK# 2 from v$active_session_history ash, v$ev原创 2014-03-12 11:06:10 · 1794 阅读 · 0 评论 -
慎用位图索引
/* Formatted on 2014/03/18 09:48 (Formatter Plus v4.8.8) */SELECT c.fee_type_desc, i.order_code, b.chn_name AS rexp_code_name, i.rexp_code, (CASE (SUBSTR ((f.order_name || '/' ||原创 2014-03-18 10:59:02 · 693 阅读 · 0 评论 -
优化大型复杂SQL
with aa as (select a.agmt_id, sum(c.acct_bal) as card_bal, --借记卡期末存款余额 a.card_open_org, a.OPEN_DATE, -- 发卡日期 a.CARD_NEW_STATUS, -- 卡片状态原创 2014-04-30 10:30:42 · 786 阅读 · 0 评论 -
创建组合索引SQL从1个多小时到1S的案例
select aa.acct_org,aa.loan_acct_no,aa.FUNCTIONARY,aa.cust_no,sum(dwm.pkg_tools.currcdtran(bb.INTT,aa.trans_cur_cd,'T00CNY','2014-02-10')) as jtlx from dwf.F_AGT_LONC_BASIC_INFO_H aa left jo原创 2014-03-18 19:29:51 · 878 阅读 · 0 评论 -
INDEX RANG SCAN无需回表的情况
create table a3 as select * from dba_objectscreate index a3_idx1 on a3(owner);select owner from a3 where owner='SCOTT';SQL> set linesize 200SQL> set pagesize 200SQL> set autot traceSQL> sel原创 2014-03-19 16:44:20 · 769 阅读 · 0 评论 -
利用集群因子优化
create index END_DT_IDX1 on F_AGT_BUSINESS_CONTRACT_H(end_dt);SQL> explain plan for select * from F_AGT_BUSINESS_CONTRACT_H t where t.end_dt = date '2999-12-31';Explained.SQL> select * from ta原创 2014-03-31 10:02:24 · 929 阅读 · 1 评论 -
PL/SQL 0.几秒出结果,SQL效率一定高吗?
今天开发问我一个问题,PL/SQL很快出结果了,为什么应用还是很慢create index F_AGT_SAVB_ACCTINFO_H_idx4 on F_AGT_SAVB_ACCTINFO_H(agmt_id,last_trans_date,acct_bal,start_dt,end_dt,acct_status);SQL> select agmt_id, max(last_tra原创 2014-04-30 11:23:32 · 804 阅读 · 0 评论 -
组合索引
一: 创建的索引1create index f_agt_comr_intdist_h_idx2 on f_agt_comr_intdist_h(agmt_id,intt,payable_int_amt,dw_data_dt) tablespace EDWFIDXTBS nologging SQL> select aa.acct_org,aa.loan_acct_no,aa.FU原创 2014-03-19 19:38:54 · 587 阅读 · 0 评论 -
组合索引避免索引扫描后在过滤
SQL> select corp_org,count(*) from test_2 where end_dt > date'2013-05-01' 2 group by corp_org order by count(*) desc;CORP_ORG COUNT(*)---------- ----------15601 2367343117原创 2014-03-19 19:45:27 · 641 阅读 · 0 评论 -
并行进程问题
SQL> select * from v$mystat where rownum SIDSTATISTIC# VALUE---------- ---------- ---------- 858 0 0 SQL> select /*+ parallel(t 4)*/ count(*),agmt_id fromF_AGT_COMR原创 2014-04-01 11:08:35 · 500 阅读 · 0 评论 -
组合索引和单列索引效率对比
SQL> create table test as select * from dba_objects;Table created.select * from test where object_id=10 and OWNER='SYS';SQL> select count(*) from test where object_id=10; COUNT(*)--------原创 2014-04-03 11:25:03 · 872 阅读 · 0 评论 -
走FILTER效率高的2种情况
FILTER的适用范围:1. 主表返回的记录数较少2.子查询返回记录数较小下面做实验证明:select department_name from hr.dept_1 dept where department_id IN (select department_id from hr.employees_1 emp);SQL> select count(*) from dept_原创 2014-05-06 10:15:24 · 1098 阅读 · 0 评论 -
HASH JOIN算法
哈希连接(HASH JOIN)前文提到,嵌套循环只适合输出少量结果集。如果要返回大量结果集(比如返回100W数据),根据嵌套循环算法,被驱动表会扫描100W次,显然这是不对的。看到这里你应该明白为什么有些SQL优化了跑几秒,没优化跑几个小时甚至跑1天都不出结果。返回大量结果集适合走HASH JOIN。HASH JOIN算法非常复杂,这里就不讨论了 下面看一个HASH JOIN的例子(基于原创 2014-04-16 22:19:22 · 721 阅读 · 0 评论 -
什么时候使用NO_UNNEST
select * from test a where object_id in (select department_id from hr.dept_1 dept where department_id IN (select department_id from hr.employees_1 emp)); SQL> select count(*) from test; C原创 2014-05-06 12:10:03 · 994 阅读 · 0 评论 -
标量子查询 子查询执行次数计算公式
select a.username,(select count(*) from all_objects b where b.owner=a.username) cnt from all_users a;create table a as select * from all_users;create table b as select * from all_objects;select原创 2014-04-22 11:21:30 · 1161 阅读 · 0 评论