需要帮助在Oracle11g中调优查询

时间:2013-04-18 07:34:14

标签: sql oracle11g

由于条件有所改变,我正在修改原始问题 - 我在Oracle11g&显示结果需要27秒。任何人都可以建议解决方案,以改善查询的响应时间?我在下面提供相关细节 -

select  Column1 , round(count(Column2)/10) 
from SE_CA 
where Column3 <= 4855 
and Column4 > 4490
group by Column1;

SE_CA table has total 123914265 records.

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3324421310

-------------------------------------------------
| Id  | Operation          | Name  | Cost (%CPU)|
-------------------------------------------------
|   0 | SELECT STATEMENT   |       |   211K  (3)|
|   1 |  HASH GROUP BY     |       |   211K  (3)|
|*  2 |   TABLE ACCESS FULL| SE_CA |   208K  (1)|
-------------------------------------------------

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
---------------------------------------------------

   2 - filter("Column3"<=4855 AND "Column4">4490)



SQL> desc SE_CA;
Name                                      Null?     Type
Column1                                             VARCHAR2(3)
Column2                                             NUMBER
Column3                                             NUMBER
Column4                                             NUMBER
Column5                                             NUMBER
Column6                                             NUMBER
Column7                                             NUMBER
Column8                                             NUMBER
Column9                                             VARCHAR2(5)
Column10                                            VARCHAR2(12)


Index Definition -

CREATE  INDEX IDX1_SE_CA ON SE_CA(Column3);
CREATE  INDEX IDX2_SE_CA ON SE_CA(Column4);
CREATE  INDEX IDX4_SE_CA ON SE_CA(Column1);
  • 在应用这两个条件的情况下,预期输出约为10% 整个表行(10581643行)。
  • 单独应用每个条件时,column3的输出为 10581643和Column4是12391426。
  • Min&amp; Column3的最大值为4623&amp;分别为4988。
  • 然而,Min&amp; column4的最大值分别为4624和4991.

您能告诉我创建的索引是否正确或我是否需要不同的索引?

1 个答案:

答案 0 :(得分:0)

了解是否可以提高此查询的性能的关键是了解有关数据的几个基本统计信息。

  1. 您拥有谓词的两列(max,min)的值范围是什么?
  2. 您期望的各行百分比会单独满足每个条件吗?
  3. 您期望的行数百分比符合这两个条件?
  4. 如果谓词Column3&lt; = 4855将包含表的30%的行,那么全表扫描或快速全索引扫描将是优化器的最佳选择,如果是只有表格上的谓词

    现在,可能是谓词Column4&gt; 4490将包括表的90%的行 - 基于此,优化者可能得出结论,当两个谓词都存在时,那么要检索的行的比例是0.3 * 0.9 = 27%。这仍然表明完全扫描是合适的。

    然而,这两个值之间可能存在相关性,因此column1的低值很少具有column2的高值,并且只有3%的行满足该条件。在这种情况下,可能值得尝试使用基于索引的访问方法。

    这是优化器动态采样可以通过包含优化器提示来检测的情况:

    select /*+ dynamic_sampling(SE_CA 4) */  Column1 , ...
    

    所以得到关于值分布的问题的答案,并尝试动态采样 - 这个查询看起来像是一个很好的候选者,因为我认为“EXPOSED_TIME”和“INFECTIOUS_TIME”之间存在相关性。 )

    另外

    由于您希望从表中检索大约10%的行,因此基于索引的访问表的方法不太可能有所帮助。甚至索引范围扫描也可能不如优化器选择的索引快速全扫描有效。这取决于I / O子系统的效率以及单块和多块i / o的相对速度。 (你能确保段空间是自动分配的,还是以至少1MB的单位统一分配?)

    但是,如果您具有可用的分区选项,则可以在EXPOSED_TIME上对此表进行范围分区,以便允许更有效的分区修剪扫描以选择表行的子集。尽管如此,这是一个很大的改变,并且必须考虑到对其他操作的副作用。

    您可能还会考虑使用低度的查询并行性,尽管这也会产生副作用(段级检查点,这可能会对表中发生很多更改的表产生负面影响)时间)。