【问题标题】:Temp tablespace runs out of space and prompts ORA-01652 when a select is executed临时表空间空间不足并在执行选择时提示 ORA-01652
【发布时间】:2016-10-11 08:39:29
【问题描述】:

我在执行大型查询时遇到问题,其中 oracle 实例的临时表空间空间不足。以下链接是查询。

https://dl.dropboxusercontent.com/u/96203352/Query/title_block.sql

Temp 表空间的大小为 30 GB,出于客户的考虑,我无法进一步扩展其空间。因此,我试图减少排序操作,但一切都徒劳无功。无论如何要优化或减少此查询的排序操作。

在以下链接中放置了 PLAN Table 的统计信息。

https://dl.dropboxusercontent.com/u/96203352/Query/PLAN_TABLE_INFO.txt

由于查询的大小和解释计划在此问题中发布的方式很大,因此我必须在使用链接时分享它。很抱歉给您带来不便。

由于返回的数据存在重复,我无法从 select 语句中删除另一件事。

请帮忙。

【问题讨论】:

  • 是否需要区分(和子查询),如果您不执行该步骤,是否有任何改进?您是否考虑过加入 iistentry 一次然后旋转(可能手动合并特定于列的条件)以获取单独的列?
  • 我试过了。但没有明显改善。
  • 使用 row_number() 分析函数来避免重复,我认为它会比 distinct 便宜
  • 我无法访问文件(保管箱被阻止),您是否在查询中使用 with 子句?
  • 是否可以选择创建表而不是视图,然后使用通过一个或多个循环手动收集数据的过程填充表?

标签: oracle query-optimization


【解决方案1】:

查询计划在最上面说明了一切:DISTINCT 操作正在使用所有临时空间。该操作需要这么多内存的原因是您的查询行太胖了......每个大约 10,000 个字节!!!

我不确定为什么您的查询行如此之多,但我会尝试的一个建议是更改您的查询以执行 DISTINCT 操作,然后在稍后的步骤中,CAST 必要的列VARCHAR2(3999)。从逻辑上讲,这不应该影响它,但多年来我看到CAST 的奇怪行为。我不会相信它,至少不尝试我的建议。

【讨论】:

  • 谢谢马修。我会试试的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
相关资源
最近更新 更多