oracle 性能优化操作七:索引提高数据分布不均匀时查询效率

索引的选择性低,但数据的值分布差异很大时,仍然可以利用索引提高效率。

A、数据分布不均匀的特殊情况下,选择性不高的索引也要创建。

表ServiceInfo中数据量很大,假设有一百万行,其中有一个字段DisposalCourseFlag,取值范围为枚举值:[0,1,2,3,4,5,6,7]。

按照前面说的索引建立的规则,“选择性不高的字段不应该建立索引”,

该字段只有8种取值,索引值的重复率很高,索引选择性明显很低,因此不建索引。

然而,由于该字段上数据值的分布情况非常特殊,具体如下表:

取值范围                     占总数据量的百分比

1~5                                          1%

6                                               98%

7                                               1%

而且,常用的查询中,查询DisposalCourseFlag<6 的情况既多又频繁,毫无疑问,如果能够建立索引,并且被应用,

那么将大大提高这种情况的查询效率。因此,我们需要在该字段上建立索引。

时间: 2024-08-10 19:47:51

oracle 性能优化操作七:索引提高数据分布不均匀时查询效率的相关文章

oracle 性能优化操作八: 利用HINT强制指定索引

在ORACLE优化器无法用上合理索引的情况下,利用HINT强制指定索引. 继续"oracle 性能优化操作七"的例子,ORACLE缺省认定,表中列的值是在所有数据行中均匀分布的, 也就是说,在一百万数据量下,每种DisposalCourseFlag值各有12.5万数据行与之对应. 假设SQL搜索条件DisposalCourseFlag=2,利用DisposalCourseFlag列上的索引进行数据搜索效率, 往往不比全表扫描的高,ORACLE因此对索引"视而不见",

oracle 性能优化操作九: 屏蔽无用索引

继续"oracle 性能优化操作八"的例子 由于实际查询中,还有涉及到DisposalCourseFlag=6的查询,而此时如果用上该字段上的索引,将是非常不明智的,效率也极低. 因此这种情况下,我们需要用特殊的方法屏蔽该索引,以便ORACLE选择其他字段上的索引. 比如,如果字段为数值型的就在表达式的字段名后,添加"+ 0",为字符型的就并上空串:||"" 如: select * from serviceinfo where DisposalC

oracle 性能优化操作五:尽量去掉 &quot;&lt;&gt;&quot;

尽量去掉 "<>",避免全表扫描,如果数据是枚举值,且取值范围固定,则修改为"OR"方式. 例: <span style="font-size:18px;">UPDATE SERVICEINFO SET STATE=0 WHERE STATE<>0;</span> 以上语句由于其中包含了"<>",执行计划中用了全表扫描(TABLE ACCESS FULL),没有用到s

oracle 性能优化操作:总结

oracle性能优化操作的这几篇文章,是完全可以相互结合同时运用的.而且各种方法之间相互影响,紧密联系. 这种联系既存在一致性,也可能带来冲突,当冲突发生时,需要根据实际情况进行选择,没有固定的模式. 最后决定SQL优化功力的因素就是对ORACLE基础的掌握程度了. 另外,值得注意的是:随着时间的推移和数据的累计与变化,ORACLE对SQL语句的执行计划也会改变. 比如:基于代价的优化方法,随着数据量的增大,优化器可能错误的不选择索引而采用全表扫描. 这种情况可能是因为统计信息已经过时,在数据量

提高Order by语句查询效率的两个思路

提高Order by语句查询效率的两个思路 2011-03-01 13:07 水太深 ITPUB 字号:T | T 在MySQL数据库中,Order by语句的使用频率是比较高的.但是众所周知,在使用这个语句时,往往会降低数据查询的性能.因为可能需要对数据库的记录进行重新排序.在这篇文章中,笔者就谈谈提高Order By语句查询效率的两个思路,以供大家参考. AD: 在MySQL数据库中,Order by语句的使用频率是比较高的.但是众所周知,在使用这个语句时,往往会降低数据查询的性能.因为可能

oracle 性能优化操作三:增加查询的范围限制

增加查询的范围限制,避免全范围的搜索. 例:以下查询表record 中时间ActionTime小于2001年3月1日的数据: select * from record where ActionTime < to_date ('20010301' ,'yyyymm'); 查询计划表明,上面的查询对表进行全表扫描,如果我们知道表中的最早的数据为2001年1月1日,那么,可以增加一个最小时间, 使查询在一个完整的范围之内.修改如下: select * from record where ActionT

工作问题总结一:由数据查询慢来浅谈下oracle中的like和instr函数的模糊查询效率问题

今天上午10点左右,boss告诉我们生产环境一客户在某功能下录入信息时,出现加载数据很慢的情况,因为严重影响了客户使用,就让我们赶紧查实原因,组长和我就根据领导提供的用户登录系统,找到出问题的那个功能,选择买方和银行信息后加载限额信息时组长的电脑出现的反应是浏览器卡死,我的电脑上是去趟厕所回来坐下来之后才加载出来,我靠3分钟左右的时间,崩溃!!!  赶紧查代码  经查询代码发现,加载的数据是从千万量级(有2321w余条)的表中查询,查询语句中使用了like操作符,经研究发现确实是因为查询的sql

轻松提高千万级数据库查询效率

优化数据库设计 1.数据字段类型使用varchar/nvarchar 替换 char/nchar,变长字段存储空间小,节省存储空间.在查询的时候小的空间字段搜索效率更高. 2.查询的时候避免全表扫描,可以在where和order by 的字段上建立索引. 3.where 查询子句中不对null值做判断,会导致检索引擎放弃使用索引而使用全表扫描,如:select id,name from user where age is null 可以设置age 的默认值为0,保证没有null值,修改后的sql

oracle 性能优化操作十六: 使用分区索引

在用分析命令对分区索引进行分析时,每一个分区的数据值的范围信息会放入Oracle的数据字典中. Oracle可以利用这个信息来提取出那些只与SQL查询相关的数据分区. 例如,假设你已经定义了一个分区索引,并且某个SQL语句需要在一个索引分区中进行一次索引扫描. Oracle会仅仅访问这个索引分区,而且会在这个分区上调用一个此索引范围的快速全扫描. 因为不需要访问整个索引,所以提高了查询的速度.