我有一些sprocs执行一些更复杂的查询并自由地使用集合。
我的DBA抱怨他们偶尔会消耗S#$%吨的内存TEMP表空间。
我可以对查询执行优化,但我也希望尽可能无创,我需要查看我的更改对TEMP表空间的影响。
问题:
如何查看我的查询在TEMP表空间上的成本是多少?
要考虑的一件事是我没有DBA访问权限。
提前致谢。
答案 0 :(得分:4)
取决于您的查询对临时费用的含义。
如果您可以从v $ tempseg_usage中进行选择,您可以看到您在临时数据中消耗了多少空间 - 在DEV数据库中,没有理由让您的DBA无法访问该视图。
正如gpeche所提到的那样,autotrace会让你很好地了解你在temp中做了多少IO - 所以结合空间使用情况会让你对正在发生的事情有所了解。
大型集合通常是一个坏主意 - 它们在PGA中消耗了大量内存(与TEMP非常不同),这是所有其他会话共享的 - 这将是您的DBA所关心的。大到多大取决于你的系统 - 成千上万的小记录可能不是太糟糕,但收藏中有数百或数百万条记录,我会担心。
答案 1 :(得分:4)
在进行各种有趣的查询和技巧之前,请在过滤后估算应排序的数据量。如果这大于排序区域中的大小,则排序会将块从内存移动到temp并稍后再读取它们。为原始数据大小添加一点开销;使用30%的开销。这应该对所需的总排序大小给出合理的估计。
对集合使用相同的策略。在某处必须有数据空间,没有任何魔法/压缩可以使您的数据量更小。如果你有最多1000行的内存并尝试使用1000.000行它将不适合。在这种情况下,请与您的dba交谈并尝试找到解决方案。可能是您最终对工作负载进行了分区。
答案 2 :(得分:2)
如果没有DBA访问权限,我会尝试使用AUTOTRACE。它不会为您提供TEMP表空间消耗,但您可以获得许多有用的信息来调优查询(逻辑读取,磁盘排序数,递归SQL,重做消耗,网络往返)。请注意,您需要授予一些使用AUTOTRACE的权限,但不需要完全的DBA权限。
答案 3 :(得分:2)
当您的查询正在运行时,您可以查询v $ sql_workarea_active,或者在运行之后,您可以查询v$sql_workarea。
这些将显示临时表空间使用情况,包括使用的内存,使用的磁盘空间,以及(最重要的)通过次数(空间使用只是问题的一部分 - 多通道排序非常昂贵),并且相关解释计划中步骤的用法。
然后,您可以考虑修改内存管理是否有助于减少临时表空间的使用,包括使用的绝对空间和通过计数。