基于索引的sql语句优化

基于索引的sql语句优化

ID:20637690

大小:35.00 KB

页数:3页

时间:2018-10-14

基于索引的sql语句优化_第1页
基于索引的sql语句优化_第2页
基于索引的sql语句优化_第3页
资源描述:

《基于索引的sql语句优化》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、基于索引的SQL语句优化一、尽量避免非操作符的使用通常情况下,为了对指定列建立特定的条件,需要在WHERE子句中使用诸如NOT、!=、<>、!<、!>等操作符,在索引列上使用这些非操作符,DBMS是不使用索引的,可以将查询语句转换为可以使用索引的查询。例:SELECT*FROMORDERSWHEREORDERDATE<>1997-l2转化为:SELECT*FROMORDERSWHEREORDERDATEl998-l-l这样DBMS就能利用索引字段OR

2、DERDATE,大大提高查询效率。二、避免困难的正规表达式MATCHES和LIKE关键字支持通配符匹配,技术上叫正规表达式。但这种匹配特别耗费时间。例如:SELECT*FROMSTUDENTWHERESTUDENT_NUMLIKE“98__”即使在STUDENT_NUM字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改为SELECT*FROMSTUDENTWHERESTUDENT_NUM>”98000”,在执行查询时就会利用索引来查询,显然会大大提高速度。如果一定要使用通配符也

3、要避免通配符在搜索字段的首部出现,这种情况下DBMS的优化器不会使用索引[6]。三、避免在索引列上使用NULL关键字避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引。即使索引有多列,只要这些列中有一列含有NULL,该列就会从索引中排除,也就是说如果某列存在空值,即使对该列建索引也不会提高性能[7]。任何在WHERE子句中使用ISNULL或ISNOTNULL的语句,优化器是不允许使用索引的。四、避免对查询的列使用数学运算如果在查询列使用数学运算,则DBMS优化器先要处理数学运算也会影

4、响查询效能。例如:(1)SELECT*FROMORDERDETAILSWHEREQUANTITY*2<50(2)SELECT*FROMORDERDETAILSWHEREQUANTITY<25虽然这两条查询的结果完全相同,但某些情况下第二个语句的执行效率远高于第一个,因此在查询前应将数学运算转化。五、尽量去掉IN或OR含有“IN”或“OR”的WHERE子句常会令索引失效;在不产生大量重复值的情况下,可以考虑把子句拆开,拆开的子句中应该包含索引。例:SELECTCOUNT(*)FROMEMPWHER

5、EEMP_IDIN(‘0’,’1’);可以将子句分开:SELECTCOUNT(*)FROMEMPWHEREEMP_ID=‘0’;SELECTCOUNT(*)FROMEMPWHEREEMP_ID=‘1’;然后再做一个简单的加法,与原来的SQL语句相比,查询速度有了明显提高。六、限制查询范围,减少全范围搜索例:以下查询表RECORD中时间EMP_TIME中小于2003年6月1日的数据。SELECT*FROMRECORDWHEREEMP_TIME<=TO_DATE(‘20030601’,’YYYYMM

6、’);查询计划表明,上面的查询对表进行了全表扫描,如果知道表中最早的数据为2000年1月1日,那么可以增加一个最小时间,保证查询在一个完整的范围之内[8]。SELECT*FROMRECORDWHEREEMP_TIME<=TO_DATE(‘20030601’,’YYYYMM’);ANDEMP_TIME>=TO_DATE(‘20000101’,’YYYYMM’);后一种SQL语句利用了EMP_TIME字段上的索引,从而可以提高查询的效率。把“20030601”换为一个变量,根据取值的机率,可以证明有

7、5O%以上的机率提高查询效率。同理,对于大于某个值的查询,如果知道当前可能的最大值,也可以在WHERE子句中加上“AND列名<最大值”来限制查询范围,以提高查询的效率。七、避免使用不兼容的数据类型数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。例如:SELECTTITLEFROMTITIESWHEREPRICE>100;在这条语句中,“PRICE”字段是“MONEY”型的,优化器很难对其进行优化,因为100是个整型数,应当在编程时将整型转化成为货币类型,而不要等到运行时转化。当比

8、较不同数据类型的数据时,ORACLE自动对列进行简单的类型转换。例如,假设EMP_TYPE是一个字符类型的索引列。SELECT*FROMEMPWHEREEMP_TYPE=123;这个语句被ORACLE转换为:SELECT*FROMEMPWHERETO_NUM(EMP_TYPE)=123;因为内部发生了类型转换,这个索引将不会被用到。为了避免ORACLE对SQL进行隐式的类型转换,最好把类型转换用显式形式表现出来。尤其要注意当字符和数值比较时,ORACLE会优先转换数值类型到字符类型。八、CBO下

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。