两个配置相同的oracle数据库,查询同一张表内的数据时。count某字段的值一个需要近2秒,一个为毫秒?

查询sql如下,查询qimptcomp中某一字段(非主键)一个需要2秒(50W),另一个仅需要几毫秒(100W)。请问要如何找到问题原因?
SQL> select count(*) from qimptcomp a ;

COUNT(*)
----------
503520

已用时间: 00: 00: 00.65
SQL> select count(compno) from qimptcomp a ;

COUNT(COMPNO)
-------------
503468

已用时间: 00: 00: 01.82

SQL> select count(*) from qimptcomp b;

COUNT(*)
----------
1046622

已用时间: 00: 00: 03.65
SQL> select count(compno) from qimptcomp b;

COUNT(COMPNO)
-------------
1046622

已用时间: 00: 00: 00.14
select count(compno) from qimptcomp a 查询执行计划时发现数据库A该表physical reads数据很大,会是这个影响造成的么?

第1个回答  2013-10-06
首先 count()中参数的意义,应该是替换的字段,如果是*的话,是所有字段替换,而一个字段只要替换一遍,另外这个应该是影响到了主键,导致更新是要另外更新主键,这个应该是之间的权衡关系,以上仅为个人观点推断。
第2个回答  2013-10-06
执行快的那个有可能创建了索引,或者执行过表分析操作,通常表分析操作会统计表的元信息,包括记录数、表数据占用空间等,而索引上也有表中节点的数量信息。
你可以看一下执行计划,通过执行计划就可以知道原因了。追问

两张表的结构是一样的,执行计划如下图: 但是执行的结果反而是b数据库用的时候更少(sql里面a,b是后加上的用来区分数据库的)

追答

这种情况就是数据库A该表physical reads数据很大造成的速度慢。
通常数据库的访问时间主要是由physical reads,即访问磁盘的执行时间所决定的。
对于你的这个情况,从执行计划上看不是由于索引的原因,因此感觉可能的原因有以下两种:
1 你在数据库B上做过表分析,表有相应的统计信息,所以在执行记录数量统计时不需要访问全表的记录就可以得到结果,而A则要去扫描表,不过你表A的读取效率也太慢了,7M信息要用2秒。
2 在数据库B中可能是将表放到内存中缓存了,这样就不需要物理读取操作了。

总体上我觉得还是两个数据库在表的相关设置上有区别,造成了物理访问操作的区别,从而影响了性能
可以执行表分析试试:analyze table t compute statistics;
说实话,这些数据有这么大的物理读取还真是很奇怪的

本回答被提问者采纳
第3个回答  2013-10-06
主键默认加上索引了
第4个回答  2013-10-06
复杂