不知道为什么会出现与理论完全相反的结果。请各位高手指教!
13 个解决方案
#1
最后查询出的结果一样吗?如果不一样的话:
可能记录值不一样,也影响查询速度
比如你查询条件中:
where 条件1,条件2,f1>10
如果A表中f1>10的记录比较少,而B表中的比较多,则很可能查询B表需要的时间更长
最好能把语句贴出来看看
可能记录值不一样,也影响查询速度
比如你查询条件中:
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'
查询速度速度快,结果却相反.
最初我对表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会慢一些了.
主键就有索引嘛.
而你用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表需要的时间更长
最好能把语句贴出来看看
可能记录值不一样,也影响查询速度
比如你查询条件中:
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'
查询速度速度快,结果却相反.
最初我对表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会慢一些了.
主键就有索引嘛.
而你用CREATE TABLE B AS SELECT A.* FROM A WHERE A.FLAG = '0'.
这样的语句 建立 出来的table是没有主键. 也没有索引的.
当然查表B会慢一些了.
#13
测试时,除了索引有时候SQL的缓冲对速度也有影响。
最好能看到分析计划。
最好能看到分析计划。