SQL 百分网手机站

SQL语句优化方法详细介绍

时间:2018-04-27 09:04:03 SQL 我要投稿

SQL语句优化方法详细介绍

  1. 选择最有效率的表名顺序, FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.汗颜!!以前以为dimensional table,都是多条记录呢,怪不得以前写的查询速度这么慢。

  2.Where子句中的连接顺序.:

  数据库采用自下而上的顺序解析Where子句,根据这个原理,表之间的连接必须写在其他Where条件之前, 那些可以过滤掉最大数量记录的条件必须写在Where子句的末尾.HAVING最后。这个貌似一直这么写的,不过那是在SQLSERVER里面的,前面都是用的JOIN

  3.整合简单,无关联的数据库访问:

  如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系),这个我没有体会,貌似都是按照业务逻辑把它们分成了一小块一小块的呢

  4.尽量缩小子查询的结果。

  5.用EXISTS替代IN、用NOT EXISTS替代NOT IN。貌似我做项目的时候只在少数基于条件的表连接才会用EXISTS,基本不用IN 和NOT IN。

  6.避免在索引列上使用计算.

  Where子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描. 7,用>=替代> 这个我也不是特别明白,>是IS NOT?

  8,用UNION替换OR (适用于索引列)

  通常情况下, 用UNION替换Where子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低. 在下面的'例子中, LOC_ID 和REGION上都建有索引.这个在项目中我是有遇到过的,我写了个临时表的函数,其他的SQL需要和临时表连接起来,因为业务逻辑比较复杂,连接的时候速度很慢,后来把OR都改成了UNION ALL

  9,避免在索引列上使用IS NULL和IS NOT NULL

  10,避免改变索引列的类型

  11. 需要当心的Where子句:

  某些Select 语句中的Where子句不使用索引. 这里有一些例子.

  在下面的例子里, (1)‘!=' 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中. (2) ‘||'是字符连接函数. 就象其他函数那样, 停用了索引.

  (3) ‘+'是数学函数. 就象其他数学函数那样, 停用了索引. (4)相同的索引列不能互相比较,这将会启用全表扫描.

  12. 优化GROUP BY:提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉.

  13. 避免使用耗费资源的操作:

  带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎

  执 行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序. 通常, 带有UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写. 如果你的数据库的SORT_AREA_SIZE调配得好, 使用UNION , MINUS, INTERSECT也是可以考虑的, 毕竟它们的可读性很强

  .IN SSMS,If you want to see how much cpu time did one query consumed,you can use the following flow:

  SET STATISTICS IO ON

  set statistics time on

  execute your query

  set statistics time off

  and after this you have to look messages window not results window

【SQL语句优化方法详细介绍】相关文章:

1.SQL语句优化的经验

2.SQL语句的优化问题教程

3.SQL语句编写与优化规范

4.关于sql语句优化的知识

5.SQL优化大全

6.关于MySQL开启记录执行过的SQL语句方法

7.Yii使用migrate命令执行sql语句方法

8.使用sql语句查询日期的方法