我有一个包含数百万行的表,我需要连接它们才能执行selects操作。响应时间不是很好,如何提高响应速度?我已经尝试向我选择的列添加索引,有没有工具可以用来优化sql,或者我如何诊断sql的瓶颈并改进它?任何建议都将不胜感激。我使用oracle server 10g,并使用asp.net作为我的客户机。有没有其他类型的索引对有数百万行的表有帮助?
发布于 2011-09-29 09:29:49
您可能应该从EXPLAIN PLAN开始。
Oracle使用EXPLAIN PLAN语句来确定
数据库执行指定的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个选择中最慢的一个。
发布于 2011-10-02 10:58:28
这个查询和计划可能存在数千个问题,只有当地的专家才能真正帮助您。
但值得注意的是,我注意到的第一件事是,你的计划中只有1/5使用了并行性。通常情况下,您希望所有步骤都并行运行,或者都不并行运行。
如果您的查询只返回少量数据,那么并行的开销可能不值得。Oracle可能需要额外的几秒钟时间来设置并行进程、协调它们,并执行额外的步骤来优化计划(例如,增加动态采样)。串行索引读取可能比并行全表扫描要好得多。您可能需要更改表的阶数,或者使用NOPARALLEL提示。
如果您的查询返回大量数据,那么您可能希望使用尽可能多的并行散列连接来有效地连接所有内容。对于非常大的查询,当Oracle低估基数并使用嵌套循环和索引时,通常会出现最差的性能。看看你的基数,找出计划中估计比实际低得多的第一部分,这会让你更接近问题。
https://stackoverflow.com/questions/7591354
复制相似问题