两张表结构完全相同的表,相同的查询条件,为何记录条少的查询速度反而慢?
有表A和表B,两者表结构完全相同,且都没有任何索引。表A中有20多万条记录,表B中有8万多条记录,现在分别对这两个表进行查询,查询条件完成相同。出现的结果是查询表B的时间比查询表A的时间长。理论应该是查询表B的时间比查询A的时间短。
不知道为什么会出现与理论完全相反的结果。请各位高手指教!
问题点数:20、回复次数:7Top
1 楼chunzhilv(春之绿)回复于 2006-12-04 15:22:29 得分 0
我现在把问题详细讲一下:
表A中有20多万条记录,表A进行查询,查询语句为:
SELECT A.* FROM A WHERE A.RECEIVER = '60269' AND (A.FLAG = '0')
这时查询速度比较慢,大约需要1.5秒种.如果把查询条件中 AND (A.FLAG = '0') 去掉,查询速度就快了,大约只需0.2秒.
于是我新建了一张表B,建表语句为:
CREATE TABLE B AS SELECT A.* FROM A WHERE A.FLAG = '0'.
这时表B中有8万条记录。对表B进行查询,查询语句为:
SELECT B.* FROM B WHERE A.RECEIVER = '60269' ,查询时间大约需0.5秒。
按我的理解是查询速度应该比 SELECT A.* FROM A WHERE A.RECEIVER = '60269'
查询速度速度快,结果却相反.Top
2 楼baojianjun(包子)回复于 2006-12-04 16:50:33 得分 0
贴一下你A表的索引有哪些 都是怎么建立的
Top
3 楼baojianjun(包子)回复于 2006-12-04 16:54:06 得分 0
可能的原因:
1.A表上的FLAG上没有索引
2.A表的索引是以FLAG,RECEIVER 这样的顺序的索引
3.A表上需0.2秒那是RECEIVER有索引,B表上没有索引所以查询时间大约需0.5秒.
顺便问下A表上的FLAG中的值是否就是0,1,2,3比较少的几种值,如果种类不超过10种建议使用BITMAP索引
最好把执行计划贴出来看看就知道慢在哪里了Top
4 楼chunzhilv(春之绿)回复于 2006-12-04 17:17:41 得分 0
表A和表B都没有加任何索引,A表上的FLAG中的值有0,1,2,3,4,5,6,7,8,9九种。我这上面也没有执行计划。Top
5 楼user_job()回复于 2006-12-05 22:00:21 得分 0
按照人的描述我是这么理解的. 因为你在20万条记录找(因为都是做全表扫描) A.RECEIVER = '60269' 快的原因是 此条件的记录比较多....
而你在建的B表中 CREATE TABLE B AS SELECT A.* FROM A WHERE A.FLAG = '0' 只是把 A.FLAG = '0' 的记录条数给转到B表..但是A.FLAG = '0' 的但A.RECEIVER = '60269'的记录条数并不多.在总记录为8万条中查少量的A.RECEIVER = '60269'的记录当然会慢点Top
6 楼chunzhilv(春之绿)回复于 2006-12-06 18:03:06 得分 0
谢谢各位。问题已经解决。我在表B的RECEIVER字段上加了个索引,查询速度就很快了。但是我所描述问题的出现的原因还是有点不太清楚。Top
7 楼SmallHand(火龍)回复于 2006-12-06 22:38:40 得分 0
create 比 单纯的 select 干的活多!Top




