SQL命令优化需要记住的9点事项

 更新时间:2014年08月21日 09:02:29   投稿:hebedich  
SQL命令优化这是个自从数据库诞生的时候就开始讨论的话题,每个人都有自己的理解,当然,本人也有些经验,总结给大家,希望对大家有所帮助

与数据库交互的基本语言是sql,数据库每次解析和执行sql语句多需要执行很多步骤。以sql server为例,当数据库收到一条查询语句时,语法分析器会扫描sql语句并将其分成逻辑单元(如关键词、表达式、运算符和标识符)并生成查询树,最后查询优化器将分析所有可以访问数据库的源表的方法,从中选择一组返回结果集最快且消耗资源较少的步骤。查询树随即进行更新以准确记录这个步骤,接着交由数据库引擎开始执行,然后将查询结果返回给用户。可见数据库引擎每次执行sql命令都会有很大的开销,如果提交的sql质量不高甚至有逻辑错误就会造成无谓的开销和时间浪费。为了避免这种情况,在使用sql命令时应注意以下原则:

   1、字段提取要按照“需多少、提多少”的原则,避免“select *”,尽量使用“select 字段1,字段2,字段3 ...”。实践证明,每少提取一个字段,数据库提取速度就会有相应的提升。提升的速度还要由你舍弃的字段大小来决定。

   2、尽量使用exists代替select count(*) 来判断是否存在记录。优化器优化exists谓词时支持短路功能。只要找到一行,不需要再扫描其他行就可以确定该表是否包涵行了。count函数只有在统计表中所有行的行数时使用。

   3、尽量使用(not) exists代替(not) in 操作,in的sql性能总是比较低的。

  --语句

  select dname,deptno from dept where deptno not in(select deptno from emp where dept.deptno=emo.deptno)

  --语句

  select dname,deptno from dept where not exists(select deptno from emp where dept.deptno=emo.deptno)

   4、尽量使用not in,可以用left outer join代替它。

   5、尽量不要使用or,使用or会引起全表扫描,将大大降低查询效率

   6、注意where子句的写法,必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可能地让字段顺序与索引顺序一致,范围从大到小。

   7、尽量使用“>=“,不用使用”>“

   8、在编写sql语句之前了解表的索引结构。有效地利用索引能够避免不必要的全表扫描,缩短查询时间。应该避免在where子句中使用is null、<>、!=、not、 not exist、not in、not like等命令,他们通常会引起全表扫描导致索引无效。

   9、在where 子句中,任何对列的操作(函数、计算等)讲导致索引失效,这些操作应该尽可能地移至等号右边,如where substring(id,1,1)=‘a‘,应该写成where id like 'a%‘;where result*10> 30应该写成where result >30;

对sql命令进行优化的基本原则是尽量减少类型转换和计算,充分利用表索引,减少全表扫描的次数。

相关文章

  • SQLServer触发器创建、删除、修改、查看示例代码

    SQLServer触发器创建、删除、修改、查看示例代码

    触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约束。
    2010-06-06
  • SQL Server的执行计划

    SQL Server的执行计划

    查询优化器的输出是查询执行计划,有时称为查询计划或执行计划。本文主要详细介绍了SQL Server的执行计划,感兴趣的同学可以参考阅读
    2023-04-04
  • 使用SQL语句实现查询排序,顺序和倒序

    使用SQL语句实现查询排序,顺序和倒序

    这篇文章主要介绍了使用SQL语句实现查询排序、顺序和倒序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • sql语句将数据库一条数据通过分隔符切割成多列方法实例

    sql语句将数据库一条数据通过分隔符切割成多列方法实例

    最近工作中遇到数据表中有一列数据,然后需要将该列数据分成三列,下面这篇文章主要给大家介绍了关于sql语句将数据库一条数据通过分隔符切割成多列的相关资料,需要的朋友可以参考下
    2023-03-03
  • Mysql中悲观锁与乐观锁应用介绍

    Mysql中悲观锁与乐观锁应用介绍

    乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展.这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人,文中详细介绍了悲观锁与乐观锁,需要的朋友可以参考下
    2022-08-08
  • sql server 2008 压缩备份数据库(20g)

    sql server 2008 压缩备份数据库(20g)

    这篇文章主要介绍了针对20g数据库的迁移问题,,需要的朋友可以参考下
    2018-03-03
  • 使用FORFILES命令来删除SQLServer备份的批处理

    使用FORFILES命令来删除SQLServer备份的批处理

    利用这些参数可以构造下面的例子来解决你删除备份脚本文件的难题。你可以基于更改时间/日期或者备份类型来创建脚本。你甚至可以构造能够同时参照两种标准的脚本
    2012-05-05
  • sql使用cast进行数据类型转换示例

    sql使用cast进行数据类型转换示例

    这篇文章主要介绍了sql使用cast进行数据类型转换,需要的朋友可以参考下
    2014-03-03
  • 跨数据库实现数据交流

    跨数据库实现数据交流

    这篇文章主要介绍了跨数据库实现数据交流的两种方式,一是通过链接服务器,二是使用OPENDATASOURCE/OPENROWSET连接远程服务器,需要的朋友可以参考下
    2015-08-08
  • 浅谈为什么#{}可以防止SQL注入

    浅谈为什么#{}可以防止SQL注入

    本文主要介绍了浅谈为什么#{}可以防止SQL注入,#{} 匹配的是一个占位符,会对一些敏感字符进行过滤,编译过后会对传递的值加上双引号,因此可以防止 SQL 注入问题,感兴趣的可以来了解一下
    2022-05-05

最新评论