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语句能够显著提高查询速度,减少资源消耗,提升系统整体性能。以下是一些重要的策略和注意事项: 1. **选择性原则**:在`WHERE`子句中,应...
### 数据库编程注意事项详解 #### 一、常用资料索引及论坛 在数据库编程领域,获取高质量的学习资源和参与活跃的社区交流对于提高技术水平至关重要。本文档提到了几个非常有用的资源,包括Oracle中国用户组和其他...
在SQL编程中,正确编写SQL语句对于数据库性能至关重要。以下是一些基本的SQL编写注意事项,这些技巧适用于SQL Server 2000等系统,旨在提高查询效率和减少全表扫描。 1. 避免过度使用`IN`操作符。`EXISTS`通常比`IN...
【T-SQL编程:SQL程序编写】涉及到的SQL Server中的视图操作是数据库管理与设计的重要组成部分。视图,作为数据库中的虚拟表,它不存储实际数据,而是根据定义的查询逻辑从一个或多个基表中获取数据。视图的主要用途...
### T-SQL编程入门(SQL Server) #### 一、T-SQL的组成 T-SQL (Transact-SQL) 是 Microsoft SQL Server 使用的一种扩展版本的 SQL 语言,它提供了额外的功能来增强 SQL 的功能,使开发者能够更高效地管理和操作...
在编写SQL语句时,有许多重要的注意事项需要遵循,以确保代码的效率、可读性和维护性。以下是一些关键点的详细说明: 1. **多样化解决问题的方法**:不要只关注于得到最终结果,而应探索多种实现方式,如使用...
### PL/SQL编程基础知识 #### 一、PL/SQL简介 PL/SQL(Procedural Language for SQL)是一种过程化语言,它结合了SQL的数据操纵功能和过程化语言的控制结构,使用户能够灵活地控制数据操作流程。作为Oracle数据库...
以下是对文档中提到的几个重要注意事项...总之,理解PHP的这些编程注意事项对于编写可靠且易于维护的代码至关重要。遵循最佳实践,避免使用已被废弃的功能,以及了解语言特性和潜在陷阱,都是提升代码质量的关键步骤。
不过,基于标题“Java开发注意事项”及描述“Java开发注意事项,编程人员可以看看哦”,我们可以围绕Java编程的一些核心知识点和最佳实践进行详尽阐述。 ### Java开发注意事项 #### 一、命名规范 Java中的命名...
- **2.15 谨慎使用自定义函数**:提醒开发者在使用自定义函数时需要注意的事项。 - **2.16 简洁的SQL编码**:提倡编写简洁明了的SQL代码。 - **2.17 进攻性的SQL编码**:探讨如何通过编写更具进攻性的SQL代码来...
在PHP编程领域,掌握一系列的关键注意事项对于提升代码质量和开发效率至关重要。以下是对“php编程的注意事项”这一主题的深入解析,旨在帮助初学者和有一定经验的开发者避免常见陷阱,优化编程实践。 ### 1. 统一...
1. Oracle和SQL面试准备:文档中提到了“部分常见ORACLE面试题以及SQL注意事项”,这暗示文档中包含了针对Oracle数据库和SQL语言的面试准备知识点。由于文件中对创建表和SQL语句有具体的描述,我们可以推断文档可能...
我们的配置工作就已经基本完成了,接下来就是...需要注意的是,就像我上面所提到的,要进行数据库编程,至少得有个数据库吧(巧妇难为无米之炊),还要会一些基本的数据库操作,这些对于学过数据库课程的你应该没有问题
2. **SQL编程**:深入探索Informix SQL语法,包括DML(数据操作语言)如SELECT、INSERT、UPDATE和DELETE,以及DDL(数据定义语言)用于创建和修改数据库结构。此外,还会涉及SQL事务处理和并发控制。 3. **高级特性...
在Oracle中,高级编程技巧还可能涵盖PL/SQL编程,包括存储过程、函数、触发器和包的编写和调试。 3. Karen Morton的贡献:Karen Morton是一位在Oracle领域内的专家,她可能为Oracle社区贡献了大量的文章、书籍或...
### SQL编程注意事项 - **正确性(Correctness)**:确保SQL语句能够准确执行预期的操作。 - **可读性(Readability)**:编写清晰、易于理解的SQL语句,有助于维护和调试。 - **高效性(Efficiency)**:优化查询性能,...