zoukankan      html  css  js  c++  java
  • SQL 性能优化

    当我看到sql执行很慢的时候就在想为什么这么慢?

    不外乎数据大,sql语句复杂,没有索引。

    如果要进行优化的话可以从对应的这三个问题出发:

    看看表是否可以进行拆分成小表,拆分sql语句,建立适合的索引。

    还有查看sql server官方API文档,了解sql的关键字执行顺序,了解执行顺序后才能更好的对sql进行拆分或者优化。

     

    关于sql执行顺序

    标准的SQL 的解析顺序为:参考文章 

    查询的逻辑执行顺序:

     (1) FROM < left_table> 
    
     (2) ON < join_condition> 
    
     (3) < join_type>  JOIN < right_table> 
    
     (4) WHERE < where_condition> 
    
     (5) GROUP BY < group_by_list> 
    
     (6) WITH {cube | rollup}
    
     (7) HAVING < having_condition> 
    
     (8) SELECT 
    
     (9) DISTINCT 
    
    (10) ORDER BY < order_by_list> 
    
    (11) < top_specification>  < select_list> 
    
     

     

     

     标准的SQL 的解析顺序为:

     (1).FROM 子句 组装来自不同数据源的数据

     (2).WHERE 子句 基于指定的条件对记录进行筛选

     (3).GROUP BY 子句 将数据划分为多个分组

     (4).使用聚合函数进行计算

     (5).使用HAVING子句筛选分组

     (6).计算所有的表达式

     (7).使用ORDER BY对结果集进行排序

      

    执行顺序:

     1.FROM:对FROM子句中前两个表执行笛卡尔积生成虚拟表vt1

     2.ON:对vt1表应用ON筛选器只有满足< join_condition> 为真的行才被插入vt2

     3.OUTER(join):如果指定了 OUTER JOIN保留表(preserved table)中未找到的行将行作为外部行添加到vt2 生成t3如果from包含两个以上表则对上一个联结生成的结果表和下一个表重复执行步骤和步骤直接结束

     4.WHERE:对vt3应用 WHERE 筛选器只有使< where_condition> 为true的行才被插入vt4

     5.GROUP BY:按GROUP BY子句中的列列表对vt4中的行分组生成vt5

     6.CUBE|ROLLUP:把超组(supergroups)插入vt6 生成vt6

     7.HAVING:对vt6应用HAVING筛选器只有使< having_condition> 为true的组才插入vt7

     8.SELECT:处理select列表产生vt8

     9.DISTINCT:将重复的行从vt8中去除产生vt9

     10.ORDER BY:将vt9的行按order by子句中的列列表排序生成一个游标vc10

     11.TOP:从vc10的开始处选择指定数量或比例的行生成vt11 并返回调用者

    参考文章:拆分表和拆分sql

     

  • 相关阅读:
    转发:招聘一个靠谱的 iOS
    转发:经典面试题
    APP上架证书无效:解决
    转发:Xcode插件
    Alcatraz:插件管理
    类似禅道的多条件搜索功能,比如或者并且和模糊查询和指定查询,见下图吧
    关于angularjs中,数据模型被改变,页面不刷新的解决办法
    angluar1+ionic详情页返回在原来的位置(缓存数据和页面高度)
    unable to resolve module react-native-gesture-handler from
    解决React Native:Error: Cannot find module 'asap/raw'
  • 原文地址:https://www.cnblogs.com/dawenyang/p/5719405.html
Copyright © 2011-2022 走看看