Oracle Temp表段大小 - 选择查询不一致

时间:2016-03-24 20:09:38

标签: sql oracle oracle11g

我已经使用Oracle一年了,并遇到了表空间TEMP的新问题 - 我的术语可能在这里缺乏。如何修改TEMP表段大小,以便我的选择查询始终成功运行。

我有一个select语句可以在某个时间点工作,但是在其他时候它会失败。 Oracle中的TEMP表段大小是否可能以某种方式更改,这可能会影响给定的select语句是否一次可以工作但是在另一时间失败?原因是b / c我运行了一个select语句,它将成功运行一次,但下次会失败。当它失败时会出现这个错误:

ORA-01652: unable to extend temp segment by 64 in tablespace TEMP

此TEMP表段大小是否也特定于单个用户或进程会话?或者它与所有过程的全局记忆有关吗?

我的目标是尝试找到问题并查看是否可以轻松修复内存问题或TEMP表问题。

此外,我感兴趣的是其他人是否同时运行大型查询,这可能会导致问题或通过降低TEMP表扩展其他段的能力来解决问题。

1 个答案:

答案 0 :(得分:1)

TEMP空间在实例级别分配,并由所有用户共享。如果您的查询使用了可用于该实例的TEMP空间的很大一部分,则它可能会间歇性地失败,具体取决于其他用户在该时刻正在消耗多少空间。如果某个其他用户有一个消耗所有可用TEMP空间的失控查询,即使您的查询是TEMP空间的相对较轻的消费者,也可能会出现错误,尽管它会是奇怪的是,这种情况经常发生在你问的问题上。

假设您的查询使用了可用TEMP空间的相对较大部分,我打赌它可能需要一些严肃的优化。我已经看到了我的一些查询,这些查询会无意中生成笛卡尔积,然后在其上执行DISTINCT以获得正确的结果集。这显然需要比在开始时编写正确的连接多TEMP个空间。也有可能是一个或多个对象的统计信息导致Oracle期望某个步骤在返回大量行时返回非常少量的行,这会导致优化器选择一个计划使用的TEMP远远超出预期。如果您的查询可以优化以使用较少的TEMP空间,这通常是最简单的修复。

如果您的查询已完全优化但仍然消耗了分配给该实例的TEMP空间的很大一部分,那么您希望与您的DBA进行对话。 DBA可能为系统提供了未分配TEMP空间,并且可以向TEMP添加更多GB来解决您的问题(以及其他遇到相同错误的人)。