执行完成后,Oracle sql不会从temp释放空间

时间:2018-06-11 10:56:03

标签: oracle sorting null temporary

有一张表(比方说TKubra),里面有2.255.478记录。

还有一个类似的查询:

select * 
  from kubra.tkubra 
  where ckubra is null 
  order by c1kubra asc;

ckubra没有空记录。它有3千个ID记录,其余部分都有空格字符。

ckubra有索引,但是当语句执行时,它会进行全表扫描,其成本为258.794。 结果通常会返回null。

当语句执行时,它会占用临时表空间,并且在完成后不会释放空间。

是什么原因造成的?

这是查询和临时表空间用法的结果: enter image description here enter image description here

2 个答案:

答案 0 :(得分:0)

Oracle不会在正常(BTree)索引中存储有关NULL值的信息。因此,当您使用WHERE CKUBRA IS NULL之类的条件进行查询时,数据库引擎必须执行全表扫描才能生成答案。

但是,位图索引执行存储NULL值,因此如果您希望能够使用索引查找NULL值,则可以在相应字段上创建位图索引,如:

CREATE BITMAP INDEX KUBRA.TKUBRA_2
  ON KUBRA.TKUBRA(CKUBRA);

一旦您创建了索引,请记住收集有关该表的统计信息:

BEGIN
  DBMS_STATS.GATHER_TABLE_STATS('KUBRA', 'TKUBRA');
END;

可能允许数据库使用索引来查找NULL值 - 但请注意,位图索引适用于低更新应用程序(如数据仓库),并在事务表上使用(一个经常更新的)可能会导致性能问题。

不过,它可以玩 - 你可以随时放弃它。

祝你好运。

答案 1 :(得分:0)

在返回所有行,或关闭游标或关闭会话之前,不会释放临时表空间。

您确定所有这19个会话都真正完成了执行查询吗?看起来它返回了大量数据,这意味着应用程序可能需要一段时间来检索所有行。

如果在像SQL Developer这样的IDE中运行查询,它通常只会返回前N行。您的IDE可能暗示查询已完成,但如果有更多行要接收,则尚未真正完成。