我的桌子有数百万行,我需要加入才能做出选择。响应时间不太好,我怎样才能改善其响应?我已经尝试添加索引到我选择的列,是否有一个工具,我可以用来优化SQL或如何诊断SQL的瓶颈并改善它?任何建议将非常感激。 我正在使用oracle服务器10g并使用asp.net作为我的客户端。 是否有其他类型的索引对数百万行的表有帮助?
答案 0 :(得分:5)
您应该从EXPLAIN PLAN开始。
使用EXPLAIN PLAN语句确定Oracle的执行计划 数据库遵循执行指定的SQL语句。这个说法 将描述执行计划的每个步骤的行插入到 指定表。您还可以将EXPLAIN PLAN语句作为一部分发出 SQL跟踪工具。
此语句还确定执行语句的成本。如果 任何域索引都在表上定义,然后是用户定义的CPU和 还将插入I / O成本。
然后编辑您的问题,并发布SQL语句和EXPLAIN PLAN的输出。
稍后。 。 强>
我不会对你的查询提供太多帮助。 269行,至少29个SELECT,并行查询,远程数据库,外连接(旧样式)等。
我能给你的最好建议是
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低估基数并使用嵌套循环和索引时,通常会出现性能最差的情况。查看你的基数,并找到计划中的第一部分,估计数大大低于实际值,这将使你更接近问题。