SQL编程注意事项
1 IN 操作符
用IN写出来的SQL的优点是比较容易写且清晰易懂,这比较适合现代软件开发的风格。
但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别:
ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。
推荐方案:在业务密集的SQL当中尽量不采用IN操作符。
2 NOT IN操作符
此操作是强列推荐不使用的,因为它不能应用表的索引。
推荐方案:用NOT EXISTS 或(外连接+判断为空)方案代替
3 <> 操作符(不等于)
不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。
推荐方案:用其它相同功能的操作运算代替,如:
a<>0 改为 a>0 or a<0
a<>’’ 改为 a>’’
4 IS NULL 或IS NOT NULL操作(判断字段是否为空)
判断字段是否为空一般是不会应用索引的,因为B树索引是不索引空值的。
推荐方案:
用其它相同功能的操作运算代替,如
a is not null 改为 a>0 或a>’’等。
不允许字段为空,而用一个缺省值代替空值,如业务申请中状态字段不允许为空,缺省为申请。
建立位图索引(有分区的表不能建,位图索引比较难控制,如字段值太多索引会使性能下降,多人更新操作会增加数据块锁的现象)
5 > 及 < 操作符(大于或小于操作符)
大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找,但有的情况下可以对它进行优化,如一个表有100万记录,一个数值型字段A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。那么执行A>2与A>=3的效果就有很大的区别了,因为A>2时ORACLE会先找出为2的记录索引再进行比较,而A>=3时ORACLE则直接找到=3的记录索引。
6 LIKE操作符
LIKE操作符可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,如LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’则会引用范围索引。
7 UNION操作符
UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如:
select * from gc_dfys
union
select * from ls_jg_dfys
这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。
推荐方案:采用UNION ALL操作符替代UNION,因为UNION ALL操作只是简单的将两个结果合并后就返回。
8 Order By 语句
Order By 语句的执行效率很低,因为它要排序。应避免在Order By 字句中使用表达式。
9 WHERE后面的条件顺序影响
WHERE子句后面的条件顺序对大数据量表的查询会产生直接的影响,如
Select * from zl_yhjbqk where dy_dj = '1KV以下' and xh_bz=1
Select * from zl_yhjbqk where xh_bz=1 and dy_dj = '1KV以下'
以上两个SQL中dy_dj(电压等级)及xh_bz(销户标志)两个字段都没进行索引,所以执行的时候都是全表扫描,第一条SQL的dy_dj = '1KV以下'条件在记录集内比率为99%,而xh_bz=1的比率只为0.5%,在进行第一条SQL的时候99%条记录都进行dy_dj及xh_bz的比较,而在进行第二条SQL的时候0.5%条记录都进行dy_dj及xh_bz的比较,以此可以得出第二条SQL的CPU占用率明显比第一条低。
10 查询表顺序的影响
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理。 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。当ORACLE处理多个表时, 会运用排序及合并的方式连接它们。首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行排序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并。
如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表。
11 WHERE子句中的连接顺序
ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。
12 避免使用select *
当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*’ 是一个方便的方法。不幸的是,这是一个非常低效的方法。实际上,ORACLE在解析的过程中, 会将’*’ 依次转换成所有的列名,这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
13 以下情况将不会使用索引
13.1 字符串连接(||)
select * from employee where name||department=’ZYZBIOINFO’;
select * from employee where name=’ZYZ’ and department=’BIOINFO’;
这两个查询,第二句比第一句会快,因为对于有连接运算符’||’的查询,Oracle优化器是不会使用索引的。
13.2 ‘%’通配符在第一个字符的
当通配符出现在搜索词首时,Oracle优化器不使用索引
13.3 存在数据类型隐形转换
隐含的类型转换可能会使Oracle优化器忽略索引。
13.4 列上有数学运算
如:select * from staff_member where salary*2<10000;
13.5 索引列上使用函数
14 多个索引情况下的选择
当SQL语句的执行路径可以使用分布在多个表上的多个索引时, ORACLE会同时使用多个索引并在运行时对它们的记录进行合并, 检索出仅对全部索引有效的记录。
在ORACLE选择执行路径时,唯一性索引的等级高于非唯一性索引。 然而这个规则只有
当WHERE子句中索引列和常量比较才有效。如果索引列和其他表的索引类相比较。 这种子句在优化器中的等级是非常低的。
如果不同表中两个相同等级的索引将被引用, FROM子句中表的顺序将决定哪个会被率先使用。 FROM子句中最后的表的索引将有最高的优先级。
如果相同表中两个想同等级的索引将被引用, WHERE子句中最先被引用的索引将有最高的优先级。
分享到:
相关推荐
SQL语法优化策略 、T-SQL编程注意事项SQL语法优化策略 、T-SQL编程注意事项SQL语法优化策略 、T-SQL编程注意事项SQL语法优化策略 、T-SQL编程注意事项SQL语法优化策略 、T-SQL编程注意事项
主要介绍了SQL编程之子查询及注意事项,需要的朋友可以参考下
我们的配置工作就已经基本完成了,接下来就是...需要注意的是,就像我上面所提到的,要进行数据库编程,至少得有个数据库吧(巧妇难为无米之炊),还要会一些基本的数据库操作,这些对于学过数据库课程的你应该没有问题
很多朋友想用SQL2000数据库的编程方法,但是却又苦于自己是学ACCESS的,对SQL只是一点点的了解而已,这里我给大家提供以下参考---将ACCESS转化成SQL2000的方法和注意事项
三、注意事项 1、管理员账号:admin 密码:admin 数据库配置文件DBO.java 2、开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为SQLSERVER,使用java语言开发。 3、数据库文件名是jspkcsjgl.mdf ,系统名称kcsjgl ...
三、注意事项 1、管理员账号:admin 密码:admin 2、开发环境为vs2010,数据库为sqlserver2008,使用c#语言开发。 3、数据库文件名是netqyyg.mdf ,系统名称qyyg 数据库文件在 App_Data下 4.登录地址:login....
三、注意事项 1、管理员账号:admin 密码:admin 2、开发环境为vs2010,数据库为sqlserver2008,或者以上版本都可以,使用c#语言开发。 3、数据库文件名是netfcrm.mdf 4.登录地址:login.aspx
该书解释并比较了SQL Server 2000和SQL Server 2005在数据库开发相关问题上的解决方案,深入讨论了SQL Server 2005中新增的T-SQL编程特性,包含了大量的代码示例、表示例和逻辑难题以帮助数据库开发人员和管理员理解...
三、注意事项 1、管理员账号:admin密码:admin 数据库配置文件DBO.java 2、开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为mysql5.0,使用java语言开发。 3、数据库文件名是jspfjxpj.sql,系统名称jxpj 4、...
一、源码特点 ...三、注意事项 1、管理员账号:admin 密码:admin 2、开发环境为vs2010,数据库为sqlserver2008,使用c#语言开发。 3、数据库文件名aspnetsbook.mdf 4.系统首页地址:login.aspx
一、源码特点 vb.net 图书管理系统 ...三、注意事项 1、管理员账号:admin 密码:admin 2、开发环境为vs2008,数据库为sqlserver2005,使用vb语言开发。 3、数据库文件名是vbnetbook.mdf 4.登录地址:login.aspx
一、源码特点 ...三、注意事项 1、管理员账号:admin 密码:admin 2、开发环境为vs2010,数据库为sqlserver2005,使用c#语言开发。 3、数据库文件名是netsmcangku.mdf 4.登录地址:login.aspx
本书内容丰富,系统功能与具体实例相结合,讲解由浅入深,例子翔实丰富,每章精心安排了“教学重点”、“本章小结”和“本章习题”,部分小节还给出了相应的注意事项和提示,能巩固读者对SQL Server 2000的知识面的...
三、注意事项 1、管理员账号:admin密码:admin 数据库配置文件DBO.java 2、开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为sqlserver2008,使用java语言开发。 3、数据库文件名是jspxsxj.sql ,系统名称xsxj ...
三、注意事项 1、管理员账号:admin密码:admin 数据库配置文件DBO.java 2、开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为SQLSERVER,使用java语言开发。 3、数据库文件名是jspjwgl.mdf ,系统名称jwgl 4、...
一、源码特点 asp.net鲜花网站系统是一套完善的WEB...三、注意事项 1、管理员账号:admin 密码:admin 2、开发环境为vs2010,数据库为sqlserver2008或者以上版本,使用c#语言开发。 3、数据库文件名是flower.sql
一、源码特点 asp.net学习辅助系统...三、注意事项 1、管理员账号:admin 密码:admin 2、开发环境为vs2010,数据库为sqlserver2008,使用c#语言开发。 3、数据库文件名是netffuzhu.mdf 4.登录地址:index.aspx
三、注意事项 1、管理员账号:admin密码:admin 数据库配置文件DBO.java ,权限包括 用户,管理员 2、开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为SQLServer2008,使用java语言开发。 3、数据库文件名是jspzxyd....