为什么临时表和普通表的查询速度相差很多?我在用多表联合查询时,为提高速度新建了一张临时表。具体代码如下:
表card和product是普通表,其中product是基本信息表。在pl/sq下建好临时表。temp.1、用临时表
insert into temp (card_no,name,price) select card_no,name,price from product where card_no like '%%'and name like '%%' ;
select a.card_no,b.name,b.price,nvl(sum(decode(rtrim(a.card_kind),'1',sale_num,0)),0) fscs ,...... from sub_salecard a,temp b where a.card_no=b.card_no and a.card_date>='2000-5-31' and a.card_date<='2009-5-31' group by a.card_no,b.name,b.price )
2、用普通表
create temp as(select card_no,name,price from product where card_no like '%%'and name like '%%' );
select a.card_no,b.name,b.price,nvl(sum(decode(rtrim(a.card_kind),'1',sale_num,0)),0) scs ,......
from sub_salecard a,temp b where a.card_no=b.card_no and a.card_date>='2000-5-31' and
a.card_date<='2009-5-31' group by a.card_no,b.name,b.price )
普通表用了10秒
临时表用了163秒。
这是为什么
表card和product是普通表,其中product是基本信息表。在pl/sq下建好临时表。temp.1、用临时表
insert into temp (card_no,name,price) select card_no,name,price from product where card_no like '%%'and name like '%%' ;
select a.card_no,b.name,b.price,nvl(sum(decode(rtrim(a.card_kind),'1',sale_num,0)),0) fscs ,...... from sub_salecard a,temp b where a.card_no=b.card_no and a.card_date>='2000-5-31' and a.card_date<='2009-5-31' group by a.card_no,b.name,b.price )
2、用普通表
create temp as(select card_no,name,price from product where card_no like '%%'and name like '%%' );
select a.card_no,b.name,b.price,nvl(sum(decode(rtrim(a.card_kind),'1',sale_num,0)),0) scs ,......
from sub_salecard a,temp b where a.card_no=b.card_no and a.card_date>='2000-5-31' and
a.card_date<='2009-5-31' group by a.card_no,b.name,b.price )
普通表用了10秒
临时表用了163秒。
这是为什么
SQL> SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));把查询结果给出来看看差别。
1 - filter("A"."DATE" <=TO_DATE('2009-05-31 00:00:00', 'yyyy-mm-dd hh(普通表的)
3 - access("A"."DATE">=TO_DATE('1996-05-31 00:00:00', 'yyyy-mm-dd hh24:m(临时表)
你看,执行计划反映,主要是主表上的日期查询不同
都是:
select a.card_no,b.name,b.price,nvl(sum(decode(rtrim(a.card_kind),'1',sale_num,0)),0) fscs ,...... from sub_salecard a,temp b where a.card_no=b.card_no and a.card_date>='2000-5-31' and a.card_date <='2009-5-31' group by a.card_no,b.name,b.price )
2 ----------------------------------------------------------------------------------
3 | Id | Operation | Name | Rows | Bytes | Cost |
4 ----------------------------------------------------------------------------------
5 | 0 | SELECT STATEMENT | | | | |
6 | 1 | TABLE ACCESS BY INDEX ROWID| SUB_CARD | | |
7 | 2 | NESTED LOOPS | | | | |
8 | 3 | TABLE ACCESS FULL | TEMP | | | |
9 |* 4 | INDEX RANGE SCAN | IDX_SUB_UNI_NO | | | |
10 ----------------------------------------------------------------------------------
11
12 Predicate Information (identified by operation id):
13 ---------------------------------------------------
14
15 1- filter("A"."DATE"<=TO_DATE('2009-05-31 00:00:00', 'yyyy-mm-dd hh
16 24:mi:ss') AND "A"."DATE">=TO_DATE('1996-01-01 00:00:00',
17 'yyyy-mm-dd hh24:mi:ss')))
18 4 - access("A"."UNI_NO"="B"."UNI_NO")
19 Note: rule based optimization这个是普通表
1
2 ----------------------------------------------------------------------------------
3 | Id | Operation | Name | Rows | Bytes | Cost |
4 ----------------------------------------------------------------------------------
5 | 0 | SELECT STATEMENT | | | | |
6 | 1 | NESTED LOOPS | | | | |
7 | 2 | TABLE ACCESS BY INDEX ROWID| SUB_CARD | | | |
8 |* 3 | INDEX RANGE SCAN | IDX_SUB_DATE | | | |
9 | 4 | TABLE ACCESS BY INDEX ROWID| TEMPP | | | |
10 * 5 | INDEX UNIQUE SCAN | SYS_C0016924 | | | |
11 -----------------------------------------------------------------------------------
12
13 Predicate Information (identified by operation id):
14 ---------------------------------------------------
15
16 3 access("A"."DATE">=TO_DATE('1996-01-01 00:00:00', 'yyyy-mm-dd hh24:m
17 i:ss') AND "A"."DATE"<=TO_DATE('2009-05-31 00:00:00', 'yyyy-m
18 m-dd hh24:mi:ss'))
19 5 - access("A"."UNI_NO"="B"."UNI_NO")
20
21 Note: rule based optimization
这个是临时表
语句是select * from sub_card a,temp b where a.uni_no=b.uni_no and a.date>='1996-01-01' and a.date<='2009-05-31'
2 ----------------------------------------------------------------------------------
3 | Id | Operation | Name | Rows | Bytes | Cost |
4 ----------------------------------------------------------------------------------
5 | 0 | SELECT STATEMENT | | | | |
6 | 1 | TABLE ACCESS BY INDEX ROWID| SUB_CARD | | |
7 | 2 | NESTED LOOPS | | | | |
8 | 3 | TABLE ACCESS FULL | TEMP | | | |
9 |* 4 | INDEX RANGE SCAN | IDX_SUB_UNI_NO | | | |
10 ----------------------------------------------------------------------------------
11
12 Predicate Information (identified by operation id):
13 ---------------------------------------------------
14
15 1- filter("A"."DATE"<=TO_DATE('2009-05-31 00:00:00', 'yyyy-mm-dd hh
16 24:mi:ss') AND "A"."DATE">=TO_DATE('1996-01-01 00:00:00',
17 'yyyy-mm-dd hh24:mi:ss')))
18 4 - access("A"."UNI_NO"="B"."UNI_NO")
19 Note: rule based optimization这个是普通表
1
2 ----------------------------------------------------------------------------------
3 | Id | Operation | Name | Rows | Bytes | Cost |
4 ----------------------------------------------------------------------------------
5 | 0 | SELECT STATEMENT | | | | |
6 | 1 | NESTED LOOPS | | | | |
7 | 2 | TABLE ACCESS BY INDEX ROWID| SUB_CARD | | | |
8 |* 3 | INDEX RANGE SCAN | IDX_SUB_DATE | | | |
9 | 4 | TABLE ACCESS BY INDEX ROWID| TEMPP | | | |
10 * 5 | INDEX UNIQUE SCAN | SYS_C0016924 | | | |
11 -----------------------------------------------------------------------------------
12
13 Predicate Information (identified by operation id):
14 ---------------------------------------------------
15
16 3 access("A"."DATE">=TO_DATE('1996-01-01 00:00:00', 'yyyy-mm-dd hh24:m
17 i:ss') AND "A"."DATE"<=TO_DATE('2009-05-31 00:00:00', 'yyyy-m
18 m-dd hh24:mi:ss'))
19 5 - access("A"."UNI_NO"="B"."UNI_NO")
20
21 Note: rule based optimization
这个是临时表
语句是select * from sub_card a,temp b where a.uni_no=b.uni_no and a.date>='1996-01-01' and a.date<='2009-05-31'
2 ----------------------------------------------------------------------------------
3 | Id | Operation | Name | Rows | Bytes | Cost |
4 ----------------------------------------------------------------------------------
5 | 0 | SELECT STATEMENT | | | | |
6 | 1 | TABLE ACCESS BY INDEX ROWID| SUB_CARD | | |
7 | 2 | NESTED LOOPS | | | | |
8 | 3 | TABLE ACCESS FULL | TEMP | | | |
9 |* 4 | INDEX RANGE SCAN | IDX_SUB_UNI_NO | | | |
10 ----------------------------------------------------------------------------------
11
12 Predicate Information (identified by operation id):
13 ---------------------------------------------------
14
15 1- filter("A"."DATE"<=TO_DATE('2009-05-31 00:00:00', 'yyyy-mm-dd hh
16 24:mi:ss') AND "A"."DATE">=TO_DATE('1996-01-01 00:00:00',
17 'yyyy-mm-dd hh24:mi:ss')))
18 4 - access("A"."UNI_NO"="B"."UNI_NO")
19 Note: rule based optimization这个是普通表
1
2 ----------------------------------------------------------------------------------
3 | Id | Operation | Name | Rows | Bytes | Cost |
4 ----------------------------------------------------------------------------------
5 | 0 | SELECT STATEMENT | | | | |
6 | 1 | NESTED LOOPS | | | | |
7 | 2 | TABLE ACCESS BY INDEX ROWID| SUB_CARD | | | |
8 |* 3 | INDEX RANGE SCAN | IDX_SUB_DATE | | | |
9 | 4 | TABLE ACCESS BY INDEX ROWID| TEMPP | | | |
10 * 5 | INDEX UNIQUE SCAN | SYS_C0016924 | | | |
11 -----------------------------------------------------------------------------------
12
13 Predicate Information (identified by operation id):
14 ---------------------------------------------------
15
16 3 access("A"."DATE">=TO_DATE('1996-01-01 00:00:00', 'yyyy-mm-dd hh24:m
17 i:ss') AND "A"."DATE"<=TO_DATE('2009-05-31 00:00:00', 'yyyy-m
18 m-dd hh24:mi:ss'))
19 5 - access("A"."UNI_NO"="B"."UNI_NO")
20
21 Note: rule based optimization
这个是临时表
语句是select * from sub_card a,temp b where a.uni_no=b.uni_no and a.date>='1996-01-01' and a.date<='2009-05-31'