用于大型Db表的sql优化器

时间:2011-09-29 01:04:19

标签: sql database performance oracle oracle10g

我的桌子有数百万行,我需要加入才能做出选择。响应时间不太好,我怎样才能改善其响应?我已经尝试添加索引到我选择的列,是否有一个工具,我可以用来优化SQL或如何诊断SQL的瓶颈并改善它?任何建议将非常感激。 我正在使用oracle服务器10g并使用asp.net作为我的客户端。 是否有其他类型的索引对数百万行的表有帮助?

2 个答案:

答案 0 :(得分:5)

您应该从EXPLAIN PLAN开始。

  

使用EXPLAIN PLAN语句确定Oracle的执行计划   数据库遵循执行指定的SQL语句。这个说法   将描述执行计划的每个步骤的行插入到   指定表。您还可以将EXPLAIN PLAN语句作为一部分发出   SQL跟踪工具。

     

此语句还确定执行语句的成本。如果   任何域索引都在表上定义,然后是用户定义的CPU和   还将插入I / O成本。

然后编辑您的问题,并发布SQL语句和EXPLAIN PLAN的输出。

稍后。 。

我不会对你的查询提供太多帮助。 269行,至少29个SELECT,并行查询,远程数据库,外连接(旧样式)等。

我能给你的最好建议是

  • 从EXPLAIN PLAN获取更多信息,
  • 简化问题。

plan table的列数多于常用的列数。 COST,CARDINALITY,BYTES和TIME列可能有助于确定调整工作的优先顺序。

您在该查询中有10个全表扫描。 (查询计划中的“表访问已满”。)这通常是一个不好的迹象;全表扫描通常需要相对较长的时间才能运行。这不是总是一个坏兆头。对小表的完全扫描可能比索引扫描更快。

首先获取查询中29个SELECT语句中每个语句的EXPLAIN PLAN输出。如果其中任何一个显示全表扫描,您可以使用suitable indexes提高其性能。 (Oracle支持许多不同类型的索引。不要忽视多列索引的机会。)无论如何,EXPLAIN PLAN输出将帮助您识别29个SELECT中最慢的。

答案 1 :(得分:0)

此查询和计划可能存在数千个问题,只有本地专家才能真正为您提供帮助。

但是对于它的价值,我注意到的第一件事是只有1/5的计划使用并行性。通常,您希望所有步骤并行运行,或者它们都不并行运行。

如果您的查询只返回少量数据,那么并行性的开销可能不值得。 Oracle可能需要几秒钟来设置并行流程,协调它们,并执行其他步骤来优化计划(例如,增加动态采样)。 seriel索引读取可能比并行全表扫描更好。您可能需要更改表的DEGREE,或使用NOPARALLEL提示。

如果您的查询返回大量数据,您可能希望使用尽可能多的并行散列连接来有效地连接所有内容。对于非常大的查询,当Oracle低估基数并使用嵌套循环和索引时,通常会出现性能最差的情况。查看你的基数,并找到计划中的第一部分,估计数大大低于实际值,这将使你更接近问题。