zoukankan      html  css  js  c++  java
  • 提高SQL查询效率 的10大方法

    一、查询条件精确,针对有参数传入情况

    二、SQL逻辑执行顺序

    FROM–>JOIN–>WHERE–>GROUP–>HAVING–>DISTINCT–>ORDER–>TOP

    三、横向

    查询需要的字段

    当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个Column上这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误

    四、少做重复工作

    控制同一语句的多次执行,特别是一些基础数据的多次执行是很多程序员很少注意的

    减少多次的数据转换

    杜绝不必要的子查询和连接表,子查询在执行计划一般解释成外连接,多余的连接表带来额外的开销

    五、关于零时表#与表变量@

    如果语句很复杂,连接太多,可以考虑用临时表和表变量分步完成

    如果需要多次用到一个大表的同一部分数据,考虑用临时表和表变量暂存这部分数据

    如果需要综合多个表的数据,形成一个结果,可以考虑用临时表和表变量分步汇总这多个表的数据

    关于临时表和表变量的选择,在数据量较多的情况下,临时表的速度反而更快

    SELECT INTO会比CREATE TABLE + INSERT INTO的方法快,但是SELECT INTO会锁定TEMPDB的系统表SYSOBJECTS、SYSINDEXES、SYSCOLUMNS,在多用户并发环境下,容易阻塞其他进程

    六、子查询

    子查询可以用IN、NOT IN、EXISTS、NOT EXISTS引入

    NOT IN、NOT EXISTS的相关子查询可以改用LEFT JOIN代替写法

    如果保证子查询没有重复 ,IN、EXISTS的相关子查询可以用INNER JOIN 代替

    IN的相关子查询用EXISTS代替

    七、索引

    避免对索引字段进行计算操作

    SELECT ID FROM T WHERE NUM/2=100

    应改为:

    SELECT ID FROM T WHERE NUM=100*2

    避免在索引字段上使用NOT,<>,!=

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

    避免在索引列上出现数据类型转换

    避免在索引字段上使用函数

    避免建立索引的列中使用空值

    不要对索引字段进行多字段连接

    WHERE FAME+’. ‘+LNAME=’HAIWEI.YANG’

    应改为:

    WHERE FNAME=’HAIWEI’ AND LNAME=’YANG’

    八、多表连接

    多表连接的时候,连接条件必须写全,宁可重复,不要缺漏

    连接条件尽量使用聚集索引

    九、其他

    在可以使用UNION ALL的语句里,使用UNION ALL

    避免在WHERE子句中使用IN,NOT IN,OR

    避免使用耗费资源的操作,带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎执行,耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序

    LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’则会引用范围索引。

  • 相关阅读:
    PAT (Advanced Level) Practice 1071 Speech Patterns (25分)
    PAT (Advanced Level) Practice 1070 Mooncake (25分)
    PAT (Advanced Level) Practice 1069 The Black Hole of Numbers (20分)
    PAT (Advanced Level) Practice 1074 Reversing Linked List (25分)
    PAT (Advanced Level) Practice 1073 Scientific Notation (20分)
    第一次冲刺个人总结01
    构建之法阅读笔记01
    人月神话阅读笔记01
    四则运算2
    学习进度条(软件工程概论1-8周)
  • 原文地址:https://www.cnblogs.com/firstdream/p/5654606.html
Copyright © 2011-2022 走看看