| 
                         今天在写一条语句的时候,在查询分析器里边执行  要用10s,换用另外一种写法只用少于1s的时间,同事说是因为Sql句语执行顺序的原因。之前看过一点相  关的书,有一点印象,到网上找了资料,学习下。  逻辑查询处理步骤  <div class="codetitle"><a style="CURSOR: pointer" data="91563" class="copybut" id="copybut91563" onclick="doCopy('code91563')"> 代码如下:<div class="codebody" id="code91563">  (8)SELECT (9)DISTINCT  (11)   (1)FROM   (3)  JOIN   (2)    ON   (4)WHERE   (5)GROUP BY   (6)WITH {CUBE | ROLLUP}  (7)HAVING   (10)ORDER BY     每个步骤产生一个虚拟表,该虚拟表被用作下一个步骤的输入。只有最后一步生成的表返回给调用者。如  果没有某一子句,则跳过相应的步骤。  1. FROM:对FROM子句中的前两个表执行笛卡尔积,生成虚拟表VT1。  2. ON:对VT1应用ON筛选器。只有那些使为真的行才被插入VT2。  3. OUTER(JOIN):如果指定了OUTER JOIN,保留表中未找到匹配的行将作为外部行添加到VT2,生成VT3。  如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到  处理完所有的表为止。  4. 对VT3应用WHERE筛选器。只有使为TRUE的行才被插入VT4。  5. GROUP BY:按GROUP BY 子句中的列列表对VT4中的行分组,生成VT5。  6. CUBE|ROLLUP:把超组插入VT5,生成VT6。  7. HAVING:对VT6应用HAVING筛选器。只有使为TRUE的组才会被插入VT7。  8. SELECT:处理SELECT列表,产生VT8。  9. DISTINCT:将重复的行从VT8中移除,产生VT9。  10. ORDER BY:将VT9中的行按ORDER BY子句中的列列表排序,生成一个有表(VC10)。  11. TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回给调用者。  以下是其它网友的补充:  好像自已在书写 SQL 语句时由于不清楚各个关键字的执行顺序,往往组织的 SQL 语句缺少很好的逻辑,凭感觉 "拼凑" ( 不好意思,如果您的 SQL 语句也经常 "拼凑",那您是不是得好好反省一下呢?,呵呵).  这样做确实是爽了自己,可苦了机器,服务器还需要在我们的杂乱无章的 SQL 语句中寻找它下一句需要执行的关键字在哪里.  效率嘛,由于我们的感觉神经对秒以下的变化实在不敏感,暂且就认为自已写的 SQL 顺序无关紧要,"反正没什么变化!",呵呵.其实服务器对每句 SQL 解析时间都会有详细记录的,大家可以看一下自已按习惯写的 SQL 和按标准顺序写的SQL解析时间差别有多大.  因此,建议大家在平时工作中 SQL 语句按标准顺序写,一是专业,二是实用,呵呵,不过我觉得最主要的是心里感觉舒服.  标准的 SQL 的解析顺序为:  (1).FROM 子句,组装来自不同数据源的数据  (2).WHERE 子句,基于指定的条件对记录进行筛选  (3).GROUP BY 子句,将数据划分为多个分组  (4).使用聚合函数进行计算  (5).使用 HAVING 子句筛选分组  (6).计算所有的表达式  (7).使用 ORDER BY 对结果集进行排序  举例说明: 在学生成绩表中 (暂记为 tb_Grade),把 "考生姓名"内容不为空的记录按照 "考生姓名" 分组,并且筛选分组结果,选出 "总成绩" 大于 600 分的.  标准顺序的 SQL 语句为:  select 考生姓名,max(总成绩) as max总成绩  from tb_Grade  where 考生姓名 is not null  group by 考生姓名  having max(总成绩) > 600  order by max总成绩  在上面的示例中 SQL 语句的执行顺序如下:  (1). 首先执行 FROM 子句,从 tb_Grade 表组装数据源的数据  (2). 执行 WHERE 子句,筛选 tb_Grade 表中所有数据不为 NULL 的数据  (3). 执行 GROUP BY 子句,把 tb_Grade 表按 "学生姓名" 列进行分组  (4). 计算 max() 聚集函数,按 "总成绩" 求出总成绩中最大的一些数值  (5). 执行 HAVING 子句,筛选课程的总成绩大于 600 分的.  (7). 执行 ORDER BY 子句,把最后的结果按 "Max 成绩" 进行排序.  好了,看了这些之后,我相信大家都知道了SQL中select语句的执行顺序了吧!哈哈!                         (编辑:莱芜站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |