Oracle数据库索引需要后续呵护

众所周知,在数据库中灵活使用索引,可以提高数据查询的效率。但是索引也是需要维护的。如果索引建立之后,就放任不管,那么随着时间的推移其对性能的提升效果就会逐渐下降。也就是说,索引建立好之后在后期还需要细心的呵护。在这里笔者就这个话题作一些深入的探讨。

一、大量数据删除后对索引的呵护。

在实际工作中我们会发现,在一张大表中,如果删除了大量的数据,那么记录的数量就会减少。此时照理来说,记录减少了,数据查询的效率应该比较高。但是实际情况与此相反。数据查询的效率反而降低了。这主要是由于数据删除后破坏了原有的索引结果。此时索引的效果就会大打折扣。当遇到这种情况时,就需要对索引进行呵护。

通常来说,当表中的数据被删除的记录数达到了20%以上时(特别是基数比较大的表格),往往需要重新建立相关的索引。重新建立索引之后,可以有效减少二元高度和在一次磁盘输入输出过程中读取的空闲间量。只有如此,数据大量删除后,性能才会随之提高。

二、直方图使用范围的局限性。

在某些场合中,使用直方图确实可以提高数据查询的性能。如表中的数据具有明显的偏斜特征的话,使用直方图会比使用其它索引具有更好的效果。但是这里需要注意,直方图在使用的过程中有严格的范围限制。也就是说,当表中的数据符合“倾斜”特征的话,直方图可以为基于成本的优化器提供一个分布图。而且在直方图中,管理员可以根据需要设置1到254个不等的存储桶,默认情况下是75个存储桶。

但是如果数据表中的数据不具备这个“倾斜”的特征,那么就对不起,在不偏斜的列上使用直方图不但不能够起到提升性能的需求,而且反而会起到反面作用,会降低数据的查询性能。所以在使用直方图的时候,一定要注意日后的追踪。在日后的管理中,发现表中的记录已经没有了“倾斜”的特征的时候,就需要马上去掉对应列上的直方图。以免搬起石头砸到自己的脚。

三、有升级需求的情况下不要对Rowid进行硬编码。

企业在日后的维护中,可能有数据库升级的需求。如从10G升级到11等等。一般情况下,如果数据库的版本能够满足企业的当前需求,笔者并不建议升级。因为在数据库升级过程中,存在比较大的风险。为此,只要数据库当前的功能已经能够满足用户的需要,或者说,在没有充分必要的情况下,不要对数据库进行升级的操作。

如果用户确实有升级的需求呢?那么在数据库维护的过程中,就需要注意对于ROWID进行硬编码。这主要是因为不同版本的Oracle数据库系统ROWID结构会有所不同。而且在以后的版本中也很有可能改变。为此如果以后有升级需求的话,就不能够将这个列设置为硬编码。否则的话,在以后升级的过程中,就会因为这个字段的编码而导致数据移植失败。

四、利用默认值来代替NULL值。

虽然在数据库表中提高了NULL值,但是这个NULL值对于索引或者数据库性能来说,会带来致命的打击。NULL值是一个特殊的“空值”,它与空格符是不同的。如果一个表中有比较多的空值的话,那么就会在很大程度上影响系统的性能。特别是在索引列上有空值。

在这里笔者建议,在后续的维护中最好使用默认值来代替NULL值。如在产品价格表中,如果某个产品没有价格,那么就利用默认值0来代表这个产品的价格。要实现这个需求非常的简单。只需要在列的设置上,给其建立一个合适的默认值。当用户没有输入相关的数据时,就直接利用这个默认值作为数据。在实际工作中,还可以利用系统日期来作为默认值等等。

如果在设置默认值的时候,还需要注意一个统一的问题。如现在有一个日期型的字段,用户给其赋予了一个系统当前日期的默认值。而这个默认值即可以在数据库服务器层面设置,而可以在客户端层面设置。那么在哪个层面设置合适呢?笔者建议是在服务器层面。因为如果在客户端层面设置的话,很可能因为各个客户端上所设置的时间不同,最终导致系统给与的默认值不同。这反而会给后续的维护带来不少的困扰。