SQL“财富”背后的习惯
【 技术】我们做软件开发的,大部分人都离不开跟数据库打交道,特别是erp开发的,跟数据库打交道更是频繁,存储过程动不动就是上千行,如果数据量大,人员流动大,那么我么还能保证下一段时间系统还能流畅的运行吗?我么还能保证下一个人能看懂我么的存储过程吗?那么我结合公司平时的培训和平时个人工作经验和大家分享一下,希望对大家有帮助。
要知道sql语句,我想我们有必要知道sqlserver查询分析器怎么执行我么sql语句的,我么很多人会看执行计划,或者用profile来监视和调优查询语句或者存储过程慢的原因,但是如果我们知道查询分析器的执行逻辑顺序,下手的时候就胸有成竹,那么下手是不是有把握点呢?
一、查询的逻辑执行顺序
(1) FROM
(2) ON
(3)
(4) WHERE
(5) GROUP BY
(6) WITH {cube | rollup}
(7) HAVING
(8) SELECT (9) DISTINCT (11)
(10) ORDER BY
标准的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 并返回调用者。
看到这里,那么用过linqtosql的语法有点相似啊?如果我们我们了解了sqlserver执行顺序,那么我们就接下来进一步养成日常sql好习惯,也就是在实现功能同时有考虑性能的思想,数据库是能进行集合运算的工具,我们应该尽量的利用这个工具,所谓集合运算实际就是批量运算,就是尽量减少在客户端进行大数据量的循环操作,而用SQL语句或者存储过程代替。