查询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数据很大,会是这个影响造成的么?
两张表的结构是一样的,执行计划如下图: 但是执行的结果反而是b数据库用的时候更少(sql里面a,b是后加上的用来区分数据库的)
这种情况就是数据库A该表physical reads数据很大造成的速度慢。
通常数据库的访问时间主要是由physical reads,即访问磁盘的执行时间所决定的。
对于你的这个情况,从执行计划上看不是由于索引的原因,因此感觉可能的原因有以下两种:
1 你在数据库B上做过表分析,表有相应的统计信息,所以在执行记录数量统计时不需要访问全表的记录就可以得到结果,而A则要去扫描表,不过你表A的读取效率也太慢了,7M信息要用2秒。
2 在数据库B中可能是将表放到内存中缓存了,这样就不需要物理读取操作了。
总体上我觉得还是两个数据库在表的相关设置上有区别,造成了物理访问操作的区别,从而影响了性能
可以执行表分析试试:analyze table t compute statistics;
说实话,这些数据有这么大的物理读取还真是很奇怪的