一条SQL语句的优化过程.doc
文本预览下载声明
一条SQL语句的优化过程
很简单的一次调整,语句加了适当的索引后性能就有大幅的提升。当时看到这条语句的时候,第一感觉就是执行效率肯定低下。语句的功能是求某一客户当天产品的总销量。
原来的语句是这样的:
select sum(sl0000) from xstfXPs2 where
dhao00 in (
select dhao00 from xstfxps1 where trunc(ywrq00)=trunc(sysdate)
and khdm00=500000003913);
已用时间: 00: 02: 49.04
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE)
2 1 NESTED LOOPS
3 2 TABLE access (FULL) OF XSTFXPS2
4 2 TABLE ACCESS (BY INDEX ROWID) OF XSTFXPS1
5 4 INDEX (UNIQUE SCAN) OF XSTFXPS1_PK (UNIQUE)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
consistent gets
34141 physical reads
2912 redo size
198 bytes sent via SQL*Net to client
275 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows PRocessed
我们看到统计信息里面进行逻辑读,34141次物理IO,这是相当吓人的数字。在执行计划里面我们看到表XSTFXPS2来了一次全表扫描。
我们首先看一下这两张表总的数据量:
SQL select count(*) from xstfxps2;
COUNT(*)
----------
5585018
我们这里看到XSTFXPS2这张表有5585018条记录。
SQL select count(*) from xstfxps1;
COUNT(*)
----------
702121
两张表的表结构如下所示:
SQL desc xstfxps1
Name Type Nullable Default Comments
------ ------------ -------- ------- --------
DHAO00 NUMBER(8)
LHDH00 NUMBER(8) Y
FLDH00 NUMBER(8) Y
FPLB00 VARCHAR2(2) Y
YWRQ00 DATE Y
YWRY00 VARCHAR2(8) Y
SHRQ00 DATE Y
XSQRRQ DATE Y
XSQRRY VARCHAR2(8) Y
KHDM00 VARCHAR2(12)
XKZH00 VARCHAR2(12)
CKDM00 VARCHAR2(2) Y
THCKDM VARCHAR2(2) Y
XSFSDM VARCHAR2(2) Y
FXRYDM VARCHAR2(4) Y
SHRYDM VARCHAR2(4) Y
SHBJ00 VARCHAR2(1) N
FXBJ00 VARCHAR2(1) N
SKBJ00 VARCHAR2(2) Y
FKDM00 VARCHAR2(2) Y
SQL desc xstfxps2
Name Type Nullable Default Comments
------ ------------ -------- ------- --------
DHAO00 NUMBER(8)
SPDM00 VARCHAR2(8)
DJIA00 NUMBER(7,2) 0
FXSL00 NUMBER Y 0
SL00
显示全部