sql 查询优化
文章平均质量分 81
3
优惠券已抵扣
余额抵扣
还需支付
¥39.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
scan724
这个作者很懒,什么都没留下…
展开
-
update关联更新
create table emp(EMPNO varchar2(20),ENAME varchar2(20),deptno varchar2(20),dname varchar2(20));insert into emp values(7599,'WORD',30,'CCC');select * from emp; EMPNO ENAME DEPTNO DNAME1 7369 SMITH 20 AAA2 7499 ALLEN 10 BBB3 7599 WORD 30 CCCcreate ..原创 2022-02-23 13:10:12 · 1566 阅读 · 1 评论 -
分页SQL模板
create table page as select * from dba_objects;BEGIN DBMS_STATS.GATHER_TABLE_STATS(ownname => 'SCOTT', tabname => 'PAGE', estimate_percent => 100, ...原创 2020-07-28 08:38:51 · 176 阅读 · 0 评论 -
FILTER 循环
SQL*Plus: Release 11.2.0.4.0 Production on ?..涓€ 4?.13 17:19:55 2020Copyright (c) 1982, 2013, Oracle. All rights reserved.Connected to:Oracle Database 12c Enterprise Edition Release 12.1.0.2...原创 2020-04-13 19:58:17 · 384 阅读 · 0 评论 -
抓出外键没创建索引的表
create table parent_tb_test ( id number(10), name varchar2(32), constraint pk_parent_tb_test primary key(id));create table child_tb_test( c_id number(10), f_id...原创 2020-01-16 17:18:20 · 267 阅读 · 0 评论 -
FILTER 索引扫描多次
explain plan for SELECT tcnt, rn, CustomerID, CustomerName, CustomerType, CertType, CertID, MFCustomerID, MCCustomerID, ManageOrgName, ...原创 2019-10-23 16:21:11 · 156 阅读 · 0 评论 -
执行计划之CONCATENATION
CONCATENATION:中文意思CREATE TABLE T_CONCAT (ID NUMBER, NAME VARCHAR2(30), TYPE VARCHAR2(30));INSERT INTO T_CONCAT SELECT ROWNUM, OBJECT_NAME, OBJECT_TYPE FROM ALL_OBJECTS;原创 2013-12-08 18:22:52 · 1649 阅读 · 0 评论 -
分区索引和全局索引
表可以按range、hash、list分区,表分区后,其上的索引和普通表上的索引有所不同,oracle对于分区表上的索引分为2类,即局部索引和全局索引,下面分别对这2种索引的特点和局限性做个总结。局部索引local index1. 局部索引一定是分区索引,分区键等同于表的分区键,分区数等同于表的分区数,一句话,局部索引的分区机制和表的分区机制一样。2. 如果原创 2013-12-09 21:42:34 · 835 阅读 · 0 评论 -
什么情况下使用全局索引和本地索引
我举个 global 索引的例子查询 条件 不走 分区键这个值但是 我走另外一个where条件而且选择性很高 假设索引高度为3不跨越分区 扫描3个block +1个 data block跨越分区 扫描 1000个 分区 *3 +1个data block 扫描要跨越 多个 分区你就建立 global 条件里不带上了分区键对应的列,对应的列就用GLOBA原创 2013-12-10 08:56:20 · 1405 阅读 · 0 评论 -
利用merge优化
create table emp_test as select * from emp;create table dept_test as select * from dept;ALTER TABLE EMP_test ADD dname VARCHAR2(50) DEFAULT 'UFO';SQL> set linesize 200SQL> select empno,e原创 2013-12-09 11:09:59 · 651 阅读 · 0 评论 -
CONCATENATION 引发的性能问题
背景是在一台11gR2的机器上,开发反映一个批处理比以前慢了3倍。经过仔细查看该SQL的执行计划,发现由于SQL中使用了or,导致CBO走出了一个非常糟糕的CONCATENATION路径。no_expand提示的说明是 The NO_EXPAND hint prevents the cost-based optimizer from considering OR-expansion f原创 2013-12-10 19:49:11 · 1233 阅读 · 0 评论 -
semijoin链接进行subquery unnesting.
drop table emp1;drop table dept1;create table emp1 as select * from emp;create table dept1 as select * from dept;SQL> select e.empno, e.deptno from emp1 e where e.deptno in (select d.dept原创 2013-12-11 10:35:24 · 587 阅读 · 0 评论 -
sort merge join导致temp被爆菊
SQL_ID cqsz37256v36j, child number 1-------------------------------------INSERT /*+append*/ INTO TMP_ACCT_AF NOLOGGING ( DATA_DATE , ACCT_NO , ACCT_ORD , ACCT_NO_PK , ACCT_BAL , D_CMP_BAL ,M_原创 2013-12-04 17:29:54 · 1235 阅读 · 0 评论 -
子查询解嵌套not in 无法展开改写
SQL> explain plan for select * from OPS$CZTEST1.SAVJ_ATOMJOURBAK where ((list_flag = '1' and prt_flag = '0') and acct_no not in (select acct_no from OPS$CZTEST1.savb_b原创 2013-12-04 15:07:47 · 991 阅读 · 0 评论 -
关于索引访问的一些探讨
索引范围扫描当谓语中包含将会返回一定范围数据的条件时就会选用索引范围扫描。索引可以是唯一或者不唯一的, 因为是由该条件来确定是否返回多个数据行的。INDEX RANGE SCAN 索引范围扫描。单块读 发生在对unique index/primary key 进行范围查找,原创 2013-12-11 20:11:44 · 644 阅读 · 0 评论 -
利用no_merge优化
SQL> select a.unit3_code 机构编码, 2 a.unit3_name 机构名称, 3 a.dept1_code 部门编码, 4 a.dept1_name 部门名称, 5 a.mgr_code 客户经理编码, 6 a.mgr_name 客户经理名称, 7原创 2013-12-05 14:13:06 · 1260 阅读 · 0 评论 -
绑定变量窥探和直方图
一、绑定变量的窥探(peek)1、Oracle在处理带有绑定变量的SQL时候,只会在硬解析的时候才会“窥探”一下SQL中绑定变量的值,然后会根据窥探到的值来决定整个SQL的执行计划。参数:_optim_peek_user_binds2、绑定变量窥探的案例create table t8(id int ,name varchar2(100));begin原创 2013-12-13 14:06:22 · 695 阅读 · 0 评论 -
创建LIST分区
一:创建分区表create table T_PM_ACCT_DTL_AF_TEST( DATA_DATE NUMBER(8), ACCT_NO VARCHAR2(100), ACCT_ORD VARCHAR2(30), ACCT_NO_PK VARCHAR2(100), ACCT_BAL NUMBER(1原创 2013-12-16 17:08:35 · 641 阅读 · 0 评论 -
NOT EXISTS优化
INSERT INTO F_PTY_INDIV (PTY_ID, PTY_NAME, GENDER_CD, BIRTHDAY, CERT_TYPE, CERT_NO, SOCINSUR_NO, COUNTRY_CD, NATION, POLITICS_CD, MARRIAGE_STAT, FAMILY_原创 2013-12-30 20:53:23 · 1027 阅读 · 0 评论 -
WITH AS 优化逻辑读
SQL> select * from fxqd_list_20131115_new where (acct_no, oper_no, seqno, trans_amt) not in (select acct_no, oper_no, seqno, trans_amt from fxqd_list where reg_date =原创 2013-12-31 08:50:42 · 683 阅读 · 0 评论 -
利用WITH AS 优化FILTER
SQL> explain plan for select * from fxqd_list_20131115_new where (acct_no, oper_no, seqno, trans_amt) not in (select acct_no, oper_no, seqno, trans_amt from fxqd_list原创 2013-12-31 08:40:20 · 844 阅读 · 0 评论 -
创建range分区
drop table T_PM_ACCT_DTL_AF_TEST;create table T_PM_ACCT_DTL_AF_TEST ( DATA_DATE date, ACCT_NO VARCHAR2(100), ACCT_ORD VARCHAR2(30), ACCT_NO_PK VARCHAR2(10原创 2013-12-17 20:14:18 · 604 阅读 · 0 评论 -
在线重定义
分区转换步骤1.检查源表是否能重定义: SQL> exec dbms_redefinition.can_redef_table('DWF','F_AGT_BUSINESS_CONTRACT_H'); PL/SQL procedure successfully completed.注意:在线重定义,必须要有主键。 2.创建我们需要重新定义的中间表,这个是一个分原创 2013-12-17 20:01:09 · 737 阅读 · 0 评论 -
关于IN-LIST迭代
IN-list iterator (IN-list迭代)字段有索引,in里有多少个值就执行多少次索引扫描。不管值是否在字段里存在~SQL> create table t1 as select * from dba_objects;表已创建。SQL> create index idx_object_id on t1(object_id);索引已创建。SQL原创 2013-12-12 21:29:56 · 819 阅读 · 0 评论 -
并行HASH JOIN小表广播问题
小表没广播的: Plan hash value: 3863004939 --------------------------------------------------------------------------------------------------------------------------------------------------------------原创 2013-12-31 10:02:56 · 1674 阅读 · 0 评论 -
sort merge join,hash join,netsloop join
Join Operations? SORT-MERGE JOIN– Sorts tables on the join key and then merges them together– Sorts are expensive? NESTED LOOPS– Retrieves a row from one table and finds the corresponding原创 2013-12-19 12:06:13 · 649 阅读 · 0 评论 -
not in改写关联无需考虑重复数据
SQL> select * from a1; ID NAME---------- ---------- 1 a 1 a 2 a 3 aSQL> select * from a2; ID---------- 2 3 2SQL> select * from a1 where id not in (select id f原创 2014-01-03 09:21:28 · 690 阅读 · 0 评论 -
谓词推入引发的惨案
早上某数据库服务器CPU不断报警,应用系统管理员同时反馈应用响应明显变慢。登陆数据库主机查看, 应用连接上来的几个进程占用了大量的CPU资源,造成CPU空闲率很低。登陆数据库查询,发现有不少buffer cache chains的等待, 初步判断是应用上出现了某些性能糟糕的SQL语句。 通过进程捕获了几条耗资源的SQL语句,发现大部分都是类似同一条语句造成的。手工执行一下,需要2原创 2013-12-04 17:11:50 · 2049 阅读 · 0 评论 -
IN改写关联注意事项!
SQL> select * from a1; ID NAME---------- ---------- 1 a 2 aSQL> select * from a2; ID NAME---------- ---------- 1 a 3 aSQL> select * from a1 where id in (select id from原创 2013-12-27 22:19:31 · 673 阅读 · 0 评论 -
利用ROWID快速执行关联更新
一.构造相关表P1,P2create table p1(id int,name char(10));create table p2(id int,name char(10));二.批量插入数据begin for i in 1 .. 100000 loop insert into p1 values(i,'a'||i); end loop ; commit;原创 2013-12-20 22:06:44 · 916 阅读 · 0 评论 -
INDEX FAST FULL SCAN和INDEX FULL SCAN
INDEX FULL SCAN 索引全扫描。单块读 。它扫描的结果是有序的,因为索引是有序的。它通常发生在 下面几种情况(注意:即使SQL满足以下情况 不一定会走索引全扫描) 1. SQL语句有order by选项,并且orde原创 2013-12-21 18:41:19 · 843 阅读 · 0 评论 -
为什么不走INDEX FAST FULL SCAN呢
create table test as select * from dba_objects;create index test_idx1 on test(object_name);BEGIN DBMS_STATS.GATHER_TABLE_STATS(ownname => 'HR', t原创 2013-12-21 19:06:45 · 940 阅读 · 0 评论 -
根据rowid回表
select rowid from T_PM_DEPOSIT_HIS partition(DEPOSIT_HIS_20120104) ;SQL> set linesize 200SQL> set pagesize 200SQL> set autot trace----该条数据取自partition(DEPOSIT_HIS_20120104) 分区SQL> selec原创 2013-12-23 08:49:42 · 657 阅读 · 0 评论 -
FILTER优化
explain plan for select a.* from fxqd_list_20131115_new_100 a where (acct_no, oper_no, seqno, trans_amt) not in (select acct_no, oper_no, seqno, trans_amt from fxqd_list b原创 2013-12-24 11:29:14 · 771 阅读 · 0 评论 -
标量子查询优化(用group by 代替distinct)
标量子查询优化 当使用另外一个SELECT 语句来产生结果中的一列的值的时候,这个查询必须只能返回一行一列的值。这种类型的子查询被称为标量子查询在某些情况下可以进行优化以减少标量子查询的重复执行,但更糟糕的场景是每一行都需要标量子查询的执行。explain plan for SELECT B.EMP_NO, B.CUST_NO, B.CU原创 2013-12-06 09:55:23 · 1550 阅读 · 0 评论 -
驱动表问题
NL改变内链接驱动表:SQL> select e.last_name, e.department_id, d.department_name from employees e, departments d where e.department_id = d.department_idand e.department_id=10; 2 3 4 Exe原创 2014-01-09 13:06:40 · 673 阅读 · 0 评论 -
利用rowid更新单表
SQL> create table test1(id int,name char(10));Table created. begin for i in 1 .. 1000000 loop insert into test1 values(i,'a'||i); end loop; commit; end;SQL> s原创 2014-01-09 21:10:04 · 719 阅读 · 0 评论 -
索引结构
Oracle索引的内部结构Oracle 使用平衡树(B-tree)存储索引以便提升数据访问速度。当不使用索引时,用户必须对数据进行顺序扫描(sequential scan)来查找指定的值。如果有 n 行数据,那么平均需要扫描的行为 n/2。因此当数据量增长时,这种方法的开销将显著增长。如果将一个已排序的值列(list of the values)划分为多个区间(range),每个区转载 2013-12-11 19:58:44 · 545 阅读 · 0 评论 -
利用merge优化
create table a1(TP_END_DATE NUMBER,WK_END_DATE NUMBER,MTH_START_DATE NUMBER,MTH_END_DATE NUMBER,TIME_PERD_START_DATE NUMBER);create table a2(TP_END_DATE DATE ,WK_END_DATE DATE,MTH_START_DATE原创 2014-01-10 22:06:52 · 762 阅读 · 0 评论 -
组合索引和单列索引效率对比
SQL> create table test(object_id NUMBER,object_name varchar2(10));Table created.SQL> begin 2 for i in 1 .. 1000000 3 loop 4 insert into test values (1,'TEST'); 5 end loop;原创 2014-01-21 14:01:55 · 1514 阅读 · 0 评论 -
关于逻辑读问题
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 · 709 阅读 · 0 评论