加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Oracle数据库索引需要后续关注

发布时间:2021-06-27 14:49:00 所属栏目:大数据 来源:互联网
导读:一、大量数据删除后对索引的呵护。 在实际工作中我们会发现,在一张大表中,如果删除了大量的数据,那么记录的数量就会减少。此时照理来说,记录减少了,数据查询的效率应该比较高。但是实际情况与此相反。数据查询的效率反而降低了。这主要是由于数据删除后
 一、大量数据删除后对索引的呵护。
 
  在实际工作中我们会发现,在一张大表中,如果删除了大量的数据,那么记录的数量就会减少。此时照理来说,记录减少了,数据查询的效率应该比较高。但是实际情况与此相反。数据查询的效率反而降低了。这主要是由于数据删除后破坏了原有的索引结果。此时索引的效果就会大打折扣。当遇到这种情况时,就需要对索引进行呵护。
 
  通常来说,当表中的数据被删除的记录数达到了20%以上时(特别是基数比较大的表格),往往需要重新建立相关的索引。重新建立索引之后,可以有效减少二元高度和在一次磁盘输入输出过程中读取的空闲间量。只有如此,数据大量删除后,性能才会随之提高。
 
  二、直方图使用范围的局限性。
 
  在某些场合中,使用直方图确实可以提高数据查询的性能。如表中的数据具有明显的偏斜特征的话,使用直方图会比使用其它索引具有更好的效果。但是这里需要注意,直方图在使用的过程中有严格的范围限制。也就是说,当表中的数据符合“倾斜”特征的话,直方图可以为基于成本的优化器提供一个分布图。而且在直方图中,管理员可以根据需要设置1到254个不等的存储桶,默认情况下是75个存储桶。
 
  但是如果数据表中的数据不具备这个“倾斜”的特征,那么就对不起,在不偏斜的列上使用直方图不但不能够起到提升性能的需求,而且反而会起到反面作用,会降低数据的查询性能。所以在使用直方图的时候,一定要注意日后的追踪。在日后的管理中,发现表中的记录已经没有了“倾斜”的特征的时候,就需要马上去掉对应列上的直方图。以免搬起石头砸到自己的脚。
 
  三、有升级需求的情况下不要对Rowid进行硬编码。
 
  企业在日后的维护中,可能有数据库升级的需求。如从10G升级到11等等。一般情况下,如果数据库的版本能够满足企业的当前需求,笔者并不建议升级。因为在数据库升级过程中,存在比较大的风险。为此,只要数据库当前的功能已经能够满足用户的需要,或者说,在没有充分必要的情况下,不要对数据库进行升级的操作。
 
  如果用户确实有升级的需求呢?那么在数据库维护的过程中,就需要注意对于ROWID进行硬编码。这主要是因为不同版本的Oracle数据库系统 ROWID结构会有所不同。而且在以后的版本中也很有可能改变。为此如果以后有升级需求的话,就不能够将这个列设置为硬编码。否则的话,在以后升级的过程中,就会因为这个字段的编码而导致数据移植失败。
 
  四、利用默认值来代替NULL值。
 
  虽然在数据库表中提高了NULL值,但是这个NULL值对于索引或者数据库性能来说,会带来致命的打击。NULL值是一个特殊的“空值”,它与空格符是不同的。如果一个表中有比较多的空值的话,那么就会在很大程度上影响系统的性能。特别是在索引列上有空值。
 
  在这里笔者建议,在后续的维护中最好使用默认值来代替NULL值。如在产品价格表中,如果某个产品没有价格,那么就利用默认值0来代表这个产品的价格。要实现这个需求非常的简单。只需要在列的设置上,给其建立一个合适的默认值。当用户没有输入相关的数据时,就直接利用这个默认值作为数据。在实际工作中,还可以利用系统日期来作为默认值等等。
 
  如果在设置默认值的时候,还需要注意一个统一的问题。如现在有一个日期型的字段,用户给其赋予了一个系统当前日期的默认值。而这个默认值即可以在数据库服务器层面设置,而可以在客户端层面设置。那么在哪个层面设置合适呢?笔者建议是在服务器层面。因为如果在客户端层面设置的话,很可能因为各个客户端上所设置的时间不同,最终导致系统给与的默认值不同。这反而会给后续的维护带来不少的困扰。
 
  五、不匹配的数据类型比较会限制索引的使用。
 
  在Oracle数据库中,即使两个值的数据类型不一致,但是只要其是兼容的,两个值也能够进行比较。如现在数据库中有一个表叫做产品表,这个表中10万条记录。在这个表中有一个字段叫做“产品关键字”。这个字段中保存着产品的编码信息,如110011、110022等等。用户在查询的时候,如果使用WHERE产品关键字=110011(此时由于没有加引号,则这个110011为数值型的数据),则仍然可以找到相关的记录。但是这个语句等号的两边,其数据类型是不一致的。左边为字符型数据、右边为数值型数据。
 
  虽然他们的数据类型不一致,但是这两个数据类型时兼容的。当这条语句执行的时候,其实数据库会自动对数据类型进行转换。以这条语句为例,在执行的时候,Oracle数据库系统会先使用转换函数对数值型的数据进行转换。虽然这个转换的作业本身不会对数据库的性能产生很大的影响。
 
  但是要命的是,只要一旦进行了转换,则数据库就会限制索引的使用。也就是说,在这种情况下,即使产品关键字这个字段设置了索引,系统在查询的时候仍然会进行全表扫描访问。这也就是说,在这个关键字上设置的索引相当于没有使用。
 
  所以这里需要特别注意,在Oracle数据库中,不匹配的数据类型进行比较时,可能会带来难以预料的性能问题。虽然从表面上看,数据库系统对于那些不匹配的数据类型比较时不会报错,反而会自动进行转换。这好像方便了用户的操作。但是毋庸置疑的是,这带来了性能上的问题。在任何情况下,只要对不匹配的数据类型进行比较,数据库系统都会自动限制对现有索引的使用。在后续性能优化的时候,当发现明明对字段设置了索引,但是在查询时系统仍然进行全表扫描的时候,就要意识到是否发生了不匹配类型的数据比较。
 
  那么如何来消除这种不匹配类型比较呢?其实方法也是蛮多的。如可以将这个产品关键字的数据类型设置为Number型。不过此时需要注意,如果为数值型的数据,其前置的0会被忽略掉。也就是说当用户输入的数据是00485257,而系统中实际存储的是485257。也就是说,如果前置的0是这个列的关键信息,不能够被忽略掉的时候,那么就不能够采用这种方法。此时比较好的处理方式是,在查询语句中想办法。即可以在查询语句中,使用WHERE产品关键字=‘110011’。也就是说,在查询条件中加入单引号,强制将数值型的数据转换为字符型的数据,而不是让数据库系统去隐式的转换。执行这个条件语句的时候,由于等号两边都是字符型数据,那么原有的索引就可以正常使用。

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读