有一张表(比方说TKubra),里面有2.255.478记录。
还有一个类似的查询:
select *
from kubra.tkubra
where ckubra is null
order by c1kubra asc;
ckubra没有空记录。它有3千个ID记录,其余部分都有空格字符。
ckubra有索引,但是当语句执行时,它会进行全表扫描,其成本为258.794。 结果通常会返回null。
当语句执行时,它会占用临时表空间,并且在完成后不会释放空间。
是什么原因造成的?
答案 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可能暗示查询已完成,但如果有更多行要接收,则尚未真正完成。