我有一些链式程序可以执行一些更复杂的查询,并自由地使用集合。
我的DBA抱怨他们偶尔会消耗内存中临时表空间的S#$%ton。
我可以对查询执行优化,但我也希望尽可能地保持非侵入性,要做到这一点,我需要看到更改对临时表空间的影响。
问题:
如何查看查询在临时表空间上的开销?
需要考虑的一件事是,我没有DBA访问权限。
提前谢谢。
发布于 2012-05-08 20:59:58
如果没有DBA访问权限,我会尝试使用奥托雷。它不会为您提供临时表空间的消耗,但是您可以获得许多有用的信息来调优查询(逻辑读取、磁盘排序数、递归SQL、重做消耗、网络往返)。请注意,您需要获得一些特权才能使用AUTOTRACE,但不是完全的DBA权限。
发布于 2012-05-08 21:52:47
取决于您的查询对临时项目的成本是什么意思。
如果您可以从v$tempseg_usage中进行选择,您可以看到在DEV数据库中所消耗的空间--在DEV数据库上,您的DBA没有理由不能给您访问该视图的权限。
正如gpeche所提到的,自动跟踪会让你很好地了解你从临时项目中做了多少个IOs,这样,再加上空间的使用,你就能很好地了解正在发生的事情。
大型集合通常不是一个好主意--它们在PGA中消耗了大量内存(这与所有其他会话共享的内存非常不同)--这将是DBA所关心的问题。多大的大小取决于你的系统-低数以千计的小记录可能不是太坏,但100的数千或数百万的记录在一个集合中,我会感到担心。
发布于 2012-05-09 05:31:28
在进行各种有趣的查询和技巧之前,在过滤之后,估计应该排序的数据量。如果这个值大于排序区域的大小,排序将从内存移动到临时内存,稍后再读取它们。将少量开销添加到原始数据大小;使用30%的开销。这将为所需的总排序大小提供一个合理的估计。
对集合使用相同的策略。必须有空间为数据某处,没有魔术/压缩,使您的数据体积更小。如果您有最多1000行的内存,并尝试将它与1000.000行一起使用,那么它将不适合。在这种情况下,请与您的dba对话并尝试找到解决方案。这可能是因为您最终会对工作负载进行分区。
https://stackoverflow.com/questions/10505232
复制相似问题