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