1. 杜绝SELECT *
表连接时,绝不允许写select * ,否则按照编码错误Bug处理.
单表查询,一般情况下可以使用select *,但以下几种情况禁用:
a、表中包含lob字段(BLOB、CLOB、LONG、LONG RAW等)。
b、表中包含长度较大的字段,如varchar2(1000)以上的字段,
但该SQL实际上并不需要取出该字段的值。
c、字段数量很多,但实际要用的字段很少,比如表有50个字段,
而你实际只用5个,并且该SQL目前没有被重用。
d、DBA要求优化调整的。
2.减少访问数据库的次数
比如JAVA中用
for(int id : ids) {
roleDao.deleteRoleById(id);
}
然后发多条delete
解决办法:
用<isNotEmpty prepend="and" property="tradeNos">
<iterate property="tradeNos" open="t.trade_no in (" close=")" conjunction=",">
#tradeNos[]#
</iterate>
</isNotEmpty>
3.杜绝隐式类型转换
1、DAO传入的类型不一致。
2、sqlmap的变量没有指定类型。
3、时间类型的没有加to_date函数。
4.绑定变量和替代变量
为了不重复解析相同的SQL语句,在第一次解析之后, ORACLE将SQL语句存放在内存中.这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享.因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的执行路径.
替代变量是无法重复使用共享池中已经解析的语句和执行路径,每个不同变量的sql都需要重新解析,浪费很多oracle资源。 绑定变量用 #变量名# 表示 替代变量用 $变量名$ 表示
在order by子句中,通常使用替代变量而不是绑定变量
5.SQL中如何处理%和_
原因: Oracle中%和_是两个特殊的字符,不做特殊处理,无法查询记录中含有%和_的结果。
解决方法:
1、DAO传入的查询参数需要解析,如:
if(recordName != null) {
if(recordName.indexOf("%") >= 0) {
recordName = recordName.replaceAll("%", "\\\\%");
}else if (recordName.indexOf("_") >= 0) {
recordName = recordName.replaceAll("_", "\\\\_");
}
}
2、在sqlmap需要加上escape关键字,如:
RECORDNAME LIKE '%'||#recordName:VARCHAR#||'%’ESCAPE '\'
6.避免在索引列上使用计算和函数
如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描.
错误的写法(a.id是number类型,而b.operator_number是char类型):
select count(*) from adm_user a, adm_action_log b where a.id =b.operator_number and a.username = '小钗';
正确的写法:
select count(*) from adm_user a, adm_action_log b where a.id = to_number(b.operator_number) and a.username = '小钗';
7.分页的使用
1、分页通常是先执行COUNT语句然后执行分页语句,当COUNT返回值为0的时候,应当避免执行后面的分页语句。
Long count = roleDao.queryCountForRole(params);
if(count > 0){
List<Role> list = roleDao.queryRoleForList(params);
}
2、有时,只须执行分页语句而无须执行COUNT语句,就不要执行COUNT语句,例如,用户下载excel格式的账户明细。
3、有时,在分页前除了要统计COUNT还需要统计SUM,这些WHERE子句一致的统计应该在一条SQL中查出,而不是分多次统计。
4、包含排序逻辑的分页查询写法,必须是三层select嵌套。
8.其他
不允许出现where 1 = 1 这样没必须的条件。
先精确查找再模糊查找。
用UNION-ALL 替换UNION ( 如果有可能的话)。
不要使用count(1)代替count(*)。
count(column_name)计算该列不为NULL的记录条数。
count(distinct column_name)计算该列不为NULL的不重复值数量。
count()函数不会返回NULL,但sum()函数可能返回NULL,可以使用nvl(sum(qty),0)来避免返回NULL 。
理解NULL的含义,是“不确定”,而不是“空“。
查询时,使用is null或者is not null。
更新时,使用等于号,如:update tablename set column_name = null。
不使用ANSI连接,如inner join、left join、right join、full outer join,而使用(+)来表示外连接。
使用表的别名(Alias)可以减少解析的时间并减少由Column歧义引起的语法错误。
使用exists、not exists 代替in和not in(包含select子句)用UNION-ALL 替换UNION ( 如果有可能的话)。
不要使用count(1)代替count(*)。
count(column_name)计算该列不为NULL的记录条数。
count(distinct column_name)计算该列不为NULL的不重复值数量。
count()函数不会返回NULL,但sum()函数可能返回NULL,可以使用nvl(sum(qty),0)来避免返回NULL 。
理解NULL的含义,是“不确定”,而不是“空“。
查询时,使用is null或者is not null。
更新时,使用等于号,如:update tablename set column_name = null。
不使用ANSI连接,如inner join、left join、right join、full outer join,而使用(+)来表示外连接。
使用表的别名(Alias)可以减少解析的时间并减少由Column歧义引起的语法错误。
使用exists、not exists 代替in和not in(包含select子句)
总结: 其实优化方面还有很多,主要是ORACLE方面的,这个和公司的大小,项目管理,人员水平有密切的关系,只要开发人员平时注意的话你会发现自己水平在慢慢提高!
分享到:
相关推荐
本文将详细讲解如何在iBatis日志信息中打印SQL语句,以便更好地理解和优化数据库操作。 首先,iBatis提供了一个强大的日志系统,支持多种日志实现,如Log4j、SLF4J、Java Util Logging等。选择哪种日志实现取决于你...
### iBatis中的动态SQL语句详解 #### 引言 在进行数据库操作时,我们经常需要根据不同的条件构建不同的SQL语句。这种需求在实际开发中极为常见,尤其是在处理复杂的查询逻辑时。iBatis(现在通常被称为MyBatis)...
iBatis动态SQL标签用法 iBatis是Java持久层框架,提供了动态SQL标签来实现动态查询。动态SQL标签可以根据不同的条件生成不同的SQL语句,从而提高查询效率和灵活性。 动态SQL片段 iBatis提供了动态SQL片段的功能,...
### 关于ibatis动态SQL中的`prepend` #### 1. 动态SQL元素 在ibatis中,`<dynamic>`标签是用来构建动态SQL的核心元素之一。当使用`<dynamic>`标签时,可以将一系列条件组合起来,根据参数的不同值来决定是否加入到...
本文主要探讨如何使用Log4j框架来记录Ibatis的SQL执行情况,以便更好地理解和优化数据库操作。 首先,Log4j是Apache的一个开源项目,它提供了一个灵活的日志系统,允许开发者定义日志级别、输出格式以及输出位置,...
通过打印SQL,可以验证动态条件是否正确地被插入到最终执行的SQL中。 5. **性能优化**: 打印SQL还能帮助优化数据库查询性能。通过分析SQL语句,可以识别慢查询并进行相应的优化,如添加索引、调整SQL语句结构等。...
《iBATIS 开发指南》和《iBATIS-SqlMaps》是两本关于Java开发领域中的重要框架——iBATIS的权威指南。这两本书详细介绍了如何使用iBATIS进行数据库交互,帮助开发者深入理解并熟练掌握这一持久层框架。 iBATIS,...
这些SQL语句主要用于Oracle数据库中,涉及到了删除、插入以及查询等基本操作,并且在ibatis框架中实现了参数化处理。 ### 一、删除操作 首先我们来看第一条SQL语句: ```xml parameterClass="long"> delete ...
通过java程序查看ibatis配置文件中的sql语句(注:无法查看变量值)
9. **性能优化**:探讨如何通过缓存机制、批处理、预编译SQL等方式提升iBATIS的性能。 10. **实战案例**:通过实际项目中的例子,如用户管理、订单处理等,深入体验iBATIS在实际开发中的应用。 11. **源码分析**:...
标题与描述概述的知识点主要集中在iBATIS框架的SQL映射技术上,特别是针对不同类型的输入参数如何在iBATIS中构建SQL语句。以下是对这些知识点的详细展开: ### iBATIS SQL映射技术概览 iBATIS是早期流行的Java持久...
在本教程"08_传智播客ibatis教程_sql主键生成方式"中,你将会深入学习到如何在Ibatis中配置和使用上述各种主键生成策略,通过实例和代码讲解,帮助你更好地理解和掌握Ibatis在处理SQL主键生成方面的技巧和最佳实践。...
通过《ibatis-sqlmaps-2_cn》,你不仅可以学习到如何使用IBATIS进行数据库操作,还能了解如何优化和调试IBATIS相关的代码,从而提高开发效率。对于初学者,这是一份非常实用的学习资料;对于有经验的开发者,它可以...
在本教程中,我们将详细介绍如何搭建一个基于Ibatis 2.3.4.726版本和SQL Server 2005的开发环境。Ibatis是一个轻量级的持久层框架,它允许开发者将SQL语句与Java代码分离,提高了数据库操作的灵活性。 首先,确保你...
例如,在实现模糊查询功能时,用户的搜索关键词可能包含SQL中的特殊字符,比如`%`、`_`等。如果不做任何处理,这些特殊字符将会被SQL引擎视为通配符,从而导致查询结果出现偏差。 #### 二、特殊字符处理方法 #####...
### iBATIS-SqlMaps2入门代码文档知识点详解 #### 一、简介 iBATIS-SqlMaps2是一款用于简化Java应用程序与数据库交互过程的框架。该框架通过配置文件定义了对象关系映射规则,使得开发者能够更加专注于业务逻辑而...
iBATIS允许直接在SQL语句中处理复杂的查询和事务管理,同时提供了一种动态和灵活的方式来映射结果集到Java对象。 【SQL Server 2000】:这是微软发布的关系型数据库管理系统,主要用于存储、管理和检索数据。SQL ...
此外,该工具可能还包含了对复杂的查询条件的支持,比如模糊搜索、分页查询等,这些在生成的SQL中会以动态SQL的形式出现,使得代码更加简洁和易于维护。对于大型项目而言,这种自动化生成的功能能够显著减少编码时间...