今天在看关于undo的章节的时候遇到HWM(high-water mark)这个概念,以前隐约有听过,但并未深入了解,查了些相关解释并自己动手做了下实验。
概念了解:
在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象成书库中的水。水库中水的位置有一条线叫做水位线,在Oracle中这条线被称为高水位线(HWM)。在数据库表刚建立的时候,由于没有任何数据,HWM=0(最低值)。当插入数据以后,HWM会上涨,需要注意的是就算用DELETE语句删除数据,HWM也不会下降,即HWM在日常的增删操作中只会上涨不会下跌。
在执行SELECT语句时,SELECT会对表中的数据进行一次扫描,ORACLE会扫描HWM一下的数据块,而不是说数据库中有多少数据就扫描这么大的数据块(也许平时应用中遇到的查询速度慢可能就跟这个原因有关,但当时没有这个概念````)
如何知道一个表的HWM呢?
1.先对表进行分析:
ANALYZE TABLE T ESTIMATE STATISTICS;
2.
SELECT table_name,num_rows,blocks,empty_blocks
FROM user_tables
WHERE table_name='T';
TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS
------------------------------ ---------- ---------- ------------
T