|
1
3
尝试禁用哈希聚合:
http://oracle-randolf.blogspot.com/2011/01/hash-aggregation.html |
|
|
2
2
因为您是根据
与其说是拥有索引,不如说是告诉oracle使用它们。甲骨文对索引非常挑剔。当您根据最重要的查询选择索引时,将获得最佳结果。如有疑问,, trace a query . 通过这种方式,您可以看到oracle在查询的哪个部分花费的时间最多,以及您的索引是否被实际提取。在解决性能问题时,跟踪是非常宝贵的。 |
|
3
1
ORDER_ID是否使用主键约束声明为PK?因为如果是这样的话,我希望乐观主义者认识到,在这个查询中,DISTINCT是多余的,并对其进行优化。如果没有约束,它将不会知道这是多余的,因此将花费不必要的大量精力来“消除”结果。 |
|
|
4
1
如果这两个查询之间的差异很大,那将是令人惊讶的。您提到,不带DISTINCT的查询大约需要30秒。使用DISTINCT的查询需要多长时间? 在使用“alter session set events'10046 trace name context forever,level 8'”跟踪会话并在查询完成后断开连接后,是否可以使用DISTINCT显示查询的tkprof输出?通过这种方式,我们可以看到时间实际花在了哪里,以及它是否在等待什么(“直接路径读取温度”可能?)
发布tkprof文件后的后续行动: 我看到您成功地获得了tkprof输出,但不幸的是,您在创建tkprof文件之前没有断开会话。现在,光标处于打开状态,无法将统计行写入跟踪文件。这就是tkprof文件中没有计划/行源操作的原因。如果你能重复这个过程,如果下面的建议被证明是垃圾,那就太好了。 我这边有一点猜测:我认为DISTINCT几乎是一个不可用的选项,因为您选择了太多的列。如果这是真的,那么您的谓词“WHERE STATUS_ID='ORDER_COMPLETED'”是非常有选择性的,您将受益于此列上的索引。创建索引后,请确保对其进行了正确的分析,如果数据值有偏差,甚至可以使用直方图。最终结果将是此查询的不同计划,首先是索引范围扫描,然后是ROWID对表的访问,这将导致非常快速的查询。 创建索引后,可以使用以下语句重新分析表,包括直方图: exec dbms_stats.gather_table_stats([owner],[table_name],cascade=>true,method_opt=>'FOR ALL INDEXED COLUMNS SIZE') 当做 |
|
|
5
0
在对无法控制SQL的应用程序进行故障排除时,我发现dbms_sqltune包节省了大量时间。看见 http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28419/d_sqltun.htm ,是的,很遗憾,您应该获得使用许可。
当然,这个工具不应该代替理解应用程序及其数据结构,但是阅读详细说明更好的计划(如果找到)的执行路径的输出是有教育意义的。 |
|
|
6
-1
每次运行查询时,Oracle都会访问整个表(表访问(完整))。 在STATUS\u ID和ORDER\u TYPE\u ID列上创建索引
|