两张表结构完全相同的表,相同的查询条件,为何记录条少的查询速度反而慢?

时间:2022-07-08 21:42:04
有表A和表B,两者表结构完全相同,且都没有任何索引。表A中有20多万条记录,表B中有8万多条记录,现在分别对这两个表进行查询,查询条件完成相同。出现的结果是查询表B的时间比查询表A的时间长。理论应该是查询表B的时间比查询A的时间短。
不知道为什么会出现与理论完全相反的结果。请各位高手指教!

13 个解决方案

#1


最后查询出的结果一样吗?如果不一样的话:
可能记录值不一样,也影响查询速度
比如你查询条件中:
where 条件1,条件2,f1>10
如果A表中f1>10的记录比较少,而B表中的比较多,则很可能查询B表需要的时间更长

最好能把语句贴出来看看

#2


我现在把问题详细讲一下:
最初我对表A进行查询,查询语句为:
SELECT A.* FROM A WHERE A.RECEIVER = '60269' AND (A.FLAG = '0')
这时查询速度比较慢.如果把查询条件中 AND (A.FLAG = '0') 去掉,查询速度就快了.
于是我新建了一张表B,建表语句为:
CREATE TABLE B AS SELECT A.* FROM A WHERE A.FLAG = '0'.
这时我对表B进行查询,查询语句为:
SELECT B.* FROM B WHERE A.RECEIVER = '60269'
按我的理解是查询速度应该比 SELECT A.* FROM A WHERE A.RECEIVER = '60269'
查询速度速度快,结果却相反.

#3


数据的表空间一样吗

#4


数据的表空间是一样的。

#5


A表对RECEIVER字段建有索引,而B没有

#6


A表和B表都没有索引.

#7


A表是正常的数据表,怎么会连索引都没有呢。
看看执行计划吧,光想象,是想象不出来的。

#8


A表最初是在RECEIVER上有索引的,但是由于往A表中一次性插入多条记录时速度太慢,耗时太长,所以把索引去掉了.

#9


对表进行分析了没有呢,没有分析的话,可能执行计划不一致

#10


就这么点数据量,比较速度快慢没有依据,结果有很大偶然性。很可能的情况是A表中的数据可能都已经在缓冲池中了,当然速度就快了。

#11


谢谢各位。问题已经解决。我在表B的RECEIVER字段上加了个索引,查询速度就很快了。但是我所描述问题的出现的原因还是有点不太清楚。

#12


看你贴出来的内容. 看到原来的那个Table上是有个主键的. 
主键就有索引嘛. 
而你用CREATE TABLE B AS SELECT A.* FROM A WHERE A.FLAG = '0'. 
这样的语句 建立 出来的table是没有主键. 也没有索引的. 
当然查表B会慢一些了. 

#13


测试时,除了索引有时候SQL的缓冲对速度也有影响。
最好能看到分析计划。

#1


最后查询出的结果一样吗?如果不一样的话:
可能记录值不一样,也影响查询速度
比如你查询条件中:
where 条件1,条件2,f1>10
如果A表中f1>10的记录比较少,而B表中的比较多,则很可能查询B表需要的时间更长

最好能把语句贴出来看看

#2


我现在把问题详细讲一下:
最初我对表A进行查询,查询语句为:
SELECT A.* FROM A WHERE A.RECEIVER = '60269' AND (A.FLAG = '0')
这时查询速度比较慢.如果把查询条件中 AND (A.FLAG = '0') 去掉,查询速度就快了.
于是我新建了一张表B,建表语句为:
CREATE TABLE B AS SELECT A.* FROM A WHERE A.FLAG = '0'.
这时我对表B进行查询,查询语句为:
SELECT B.* FROM B WHERE A.RECEIVER = '60269'
按我的理解是查询速度应该比 SELECT A.* FROM A WHERE A.RECEIVER = '60269'
查询速度速度快,结果却相反.

#3


数据的表空间一样吗

#4


数据的表空间是一样的。

#5


A表对RECEIVER字段建有索引,而B没有

#6


A表和B表都没有索引.

#7


A表是正常的数据表,怎么会连索引都没有呢。
看看执行计划吧,光想象,是想象不出来的。

#8


A表最初是在RECEIVER上有索引的,但是由于往A表中一次性插入多条记录时速度太慢,耗时太长,所以把索引去掉了.

#9


对表进行分析了没有呢,没有分析的话,可能执行计划不一致

#10


就这么点数据量,比较速度快慢没有依据,结果有很大偶然性。很可能的情况是A表中的数据可能都已经在缓冲池中了,当然速度就快了。

#11


谢谢各位。问题已经解决。我在表B的RECEIVER字段上加了个索引,查询速度就很快了。但是我所描述问题的出现的原因还是有点不太清楚。

#12


看你贴出来的内容. 看到原来的那个Table上是有个主键的. 
主键就有索引嘛. 
而你用CREATE TABLE B AS SELECT A.* FROM A WHERE A.FLAG = '0'. 
这样的语句 建立 出来的table是没有主键. 也没有索引的. 
当然查表B会慢一些了. 

#13


测试时,除了索引有时候SQL的缓冲对速度也有影响。
最好能看到分析计划。