今天查1张表的时候,查询表中某1特定类型的数据特别慢,但是查询全表特别快,也没找到缘由,百度了1下下,可能感觉(很小的概率)是下面这个
有人说:
说明此表增删改太频繁了.将不需要删除的数据copy到1张临时表,truncate此表,再把数据copy回来.删除临时表。
Oracle表段中的高水位线HWM
在Oracle数据的存储中,可以把存储空间想象为1个水库,数据想象为水库中的水。水库中的水的位置有1条线叫做水位线,在Oracle中,这条线被称为高水位线(High-warter mark, HWM)。在数据库表刚建立的时候,由于没有任何数据,所以这个时候水位线是空的,也就是说HWM为最低值。当插入了数据以后,高水位线就会上涨,但是这里也有1个特性,就是如果你采取delete语句删除数据的话,数据虽然被删除,但是高水位线却没有下降,还是你刚才删除数据之前那末高的水位。也就是说,这条高水位线在平常的增删操作中只会上涨,不会下跌。
下面我们来谈1下Oracle中Select语句的特性。Select语句会对表中的数据进行1次扫描,但是究竟扫描多少数据存储块呢,这个其实不是说数据库中有多少数据,Oracle就扫描这么大的数据块,而是Oracle会扫描高水位线以下的数据块。现在来想象1下,如果刚才是1张刚刚建立的空表,你进行了1次Select操作,那末由于高水位线HWM在最低的0位置上,所以没有数据块需要被扫描,扫描时间会极短。而如果这个时候你首先插入了1千万条数据,然后再用delete语句删除这1千万条数据。由于插入了1千万条数据,所以这个时候的高水位线就在1千万条数据这里。后来删除这1千万条数据的时候,由于delete语句不影响高水位线,所以高水位线仍然在1千万条数据这里。这个时候再1次用select语句进行扫描,虽然这个时候表中没有数据,但是由于扫描是依照高水位线来的,所以需要把1千万条数据的存储空间都要扫描1次,也就是说这次扫描所需要的时间和扫描1千万条数据所需要的时间是1样多的。所以有时候有人总是常常说,怎样我的表中没有几条数据,但是还是这么慢呢,这个时候其实奥秘就是这里的高水位线了。
那有无办法让高水位线降落呢,其实有1种比较简单的方法,那就是采取TRUNCATE语句进行删除数据。采取TRUNCATE语句删除1个表的数据的时候,类似于重新建立了表,不但把数据都删除,还把HWM给清空恢复为0。所以如果需要把表清空,在有可能利用TRUNCATE语句来删除数据的时候就利用TRUNCATE语句来删除表,特别是那种数据量有可能很大的临时存储表。
在手动段空间管理(Manual Segment Space Management)中,段中只有1个HWM,但是在Oracle9iRelease1才添加的自动段空间管理(Automatic Segment Space Management)中,又有了1个低HWM的概念出来。为何有了HWM还又有1个低HWM呢,这个是由于自动段空间管理的特性酿成的。在手段段空间管理中,当数据插入以后,如果是插入到新的数据块中,数据块就会被自动格式化等待数据访问。而在自动段空间管理中,数据插入到新的数据块以后,数据块并没有被格式化,而是在第1次在第1次访问这个数据块的时候才格式化这个块。所以我们又需要1条水位线,用来标示已被格式化的块。这条水位线就叫做低HWM。1般来讲,低HWM肯定是低于等于HWM的。
最后删除过后,重新导入数据,又好了。
oracle高水位线详解
上一篇 离线Web应用Manifest
下一篇 为什么nginx性能如此出色?