`
mmBlue
  • 浏览: 167261 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ibatis中如何优化SQL

阅读更多

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日志信息中打印SQL语句,以便更好地理解和优化数据库操作。 首先,iBatis提供了一个强大的日志系统,支持多种日志实现,如Log4j、SLF4J、Java Util Logging等。选择哪种日志实现取决于你...

    iBatis的动态SQL语句

    ### iBatis中的动态SQL语句详解 #### 引言 在进行数据库操作时,我们经常需要根据不同的条件构建不同的SQL语句。这种需求在实际开发中极为常见,尤其是在处理复杂的查询逻辑时。iBatis(现在通常被称为MyBatis)...

    ibatis动态SQL标签用法

    iBatis动态SQL标签用法 iBatis是Java持久层框架,提供了动态SQL标签来实现动态查询。动态SQL标签可以根据不同的条件生成不同的SQL语句,从而提高查询效率和灵活性。 动态SQL片段 iBatis提供了动态SQL片段的功能,...

    ibatis的dynamicSQL中,关于prepend的使用

    ### 关于ibatis动态SQL中的`prepend` #### 1. 动态SQL元素 在ibatis中,`&lt;dynamic&gt;`标签是用来构建动态SQL的核心元素之一。当使用`&lt;dynamic&gt;`标签时,可以将一系列条件组合起来,根据参数的不同值来决定是否加入到...

    打log4j日志-ibatis的sql输出

    本文主要探讨如何使用Log4j框架来记录Ibatis的SQL执行情况,以便更好地理解和优化数据库操作。 首先,Log4j是Apache的一个开源项目,它提供了一个灵活的日志系统,允许开发者定义日志级别、输出格式以及输出位置,...

    ibatis打印sql

    通过打印SQL,可以验证动态条件是否正确地被插入到最终执行的SQL中。 5. **性能优化**: 打印SQL还能帮助优化数据库查询性能。通过分析SQL语句,可以识别慢查询并进行相应的优化,如添加索引、调整SQL语句结构等。...

    ibatis 开发指南 和 iBATIS-SqlMaps两本图书

    《iBATIS 开发指南》和《iBATIS-SqlMaps》是两本关于Java开发领域中的重要框架——iBATIS的权威指南。这两本书详细介绍了如何使用iBATIS进行数据库交互,帮助开发者深入理解并熟练掌握这一持久层框架。 iBATIS,...

    ibatis常用的sql

    这些SQL语句主要用于Oracle数据库中,涉及到了删除、插入以及查询等基本操作,并且在ibatis框架中实现了参数化处理。 ### 一、删除操作 首先我们来看第一条SQL语句: ```xml parameterClass="long"&gt; delete ...

    查看ibatis后台sql

    通过java程序查看ibatis配置文件中的sql语句(注:无法查看变量值)

    iBATIS-SqlMaps-中文教程

    9. **性能优化**:探讨如何通过缓存机制、批处理、预编译SQL等方式提升iBATIS的性能。 10. **实战案例**:通过实际项目中的例子,如用户管理、订单处理等,深入体验iBATIS在实际开发中的应用。 11. **源码分析**:...

    ibatis常用sql语句

    标题与描述概述的知识点主要集中在iBATIS框架的SQL映射技术上,特别是针对不同类型的输入参数如何在iBATIS中构建SQL语句。以下是对这些知识点的详细展开: ### iBATIS SQL映射技术概览 iBATIS是早期流行的Java持久...

    08_ibatis教程_sql主键生成方式.zip

    在本教程"08_传智播客ibatis教程_sql主键生成方式"中,你将会深入学习到如何在Ibatis中配置和使用上述各种主键生成策略,通过实例和代码讲解,帮助你更好地理解和掌握Ibatis在处理SQL主键生成方面的技巧和最佳实践。...

    ibatis-sqlmaps-2_cn

    通过《ibatis-sqlmaps-2_cn》,你不仅可以学习到如何使用IBATIS进行数据库操作,还能了解如何优化和调试IBATIS相关的代码,从而提高开发效率。对于初学者,这是一份非常实用的学习资料;对于有经验的开发者,它可以...

    ibatis2.0+sqlserver2005环境搭建

    在本教程中,我们将详细介绍如何搭建一个基于Ibatis 2.3.4.726版本和SQL Server 2005的开发环境。Ibatis是一个轻量级的持久层框架,它允许开发者将SQL语句与Java代码分离,提高了数据库操作的灵活性。 首先,确保你...

    ibatis sql语句对条件中特殊字符% # 处理

    例如,在实现模糊查询功能时,用户的搜索关键词可能包含SQL中的特殊字符,比如`%`、`_`等。如果不做任何处理,这些特殊字符将会被SQL引擎视为通配符,从而导致查询结果出现偏差。 #### 二、特殊字符处理方法 #####...

    iBATIS-SqlMaps2入门代码文档

    ### iBATIS-SqlMaps2入门代码文档知识点详解 #### 一、简介 iBATIS-SqlMaps2是一款用于简化Java应用程序与数据库交互过程的框架。该框架通过配置文件定义了对象关系映射规则,使得开发者能够更加专注于业务逻辑而...

    webwork+ibatis+sqlserver2000

    iBATIS允许直接在SQL语句中处理复杂的查询和事务管理,同时提供了一种动态和灵活的方式来映射结果集到Java对象。 【SQL Server 2000】:这是微软发布的关系型数据库管理系统,主要用于存储、管理和检索数据。SQL ...

    ibatis sql生成工具

    此外,该工具可能还包含了对复杂的查询条件的支持,比如模糊搜索、分页查询等,这些在生成的SQL中会以动态SQL的形式出现,使得代码更加简洁和易于维护。对于大型项目而言,这种自动化生成的功能能够显著减少编码时间...

Global site tag (gtag.js) - Google Analytics