逻辑查询处理

上一篇 / 下一篇  2009-07-31 10:38:09 / 个人分类:SQL相关

v 写在前面

SQL编程有许多独特的方面,如:面向集合的编程思想,查询元素的逻辑处理次序,三值逻辑等。本章只介绍查询处理的逻辑方面,建议阅读时尽量不考虑性能问题。本章中描述的某些逻辑

处理步骤可能看起来有些低效。但在实践中要记住:查询的实际物理处理可能与逻辑处理有很大不同。SQL Server中负责生成实际工作计划(执行计划)的组件是查询优化器,以何种顺序访问表、使用哪种访问方法和哪个索引、应用哪种联结算法等都是由优化器来决定的。优化器会生成多个有效的执行计划,并选择其中成本最低的执行计划。逻辑查询处理的各个阶段都有特定的顺序。另一方面,优化器却经常在它生成的物理执行计划中走捷径,当然,只有在保证结果集正确的情况下优化器才走捷径。例如,为了使用索引,优化器可能会决定使用一个比逻辑处理所规定的筛选器快的多的筛选器。

鉴于上述原因,明确区分查询的逻辑处理和物理处理非常有必要的。

v 逻辑查询处理的各个阶段

   SQL不同于其他编程语言的最明显的特征是处理代码的顺序。在大多数的语言中,代码按顺序被处理,但在SQL语言中,第一个被处理的子句是FROM,尽管Select语句第一个出现,但几乎总在最后被处理。每个步骤都会生成一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者不可用。只有最后一步生成的表才会返回给调用者。

v 逻辑查询处理的各个阶段逻辑查询处理阶段简介

1. FROM:From子句中的前两个表执行笛卡尔积(交叉联接),生成虚拟表VT1

2. ON:VT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入到VT2

3. OUTER(JOIN):如果指定了OUTER JOIN(相对于CROSS JOININNER JOIN),保留表中未找到匹配的行将作为外部行添加到VT2中,生成VT3.如果FROM子句中包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤一到三,直到处理完所有表。

4. WHERE: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,并返回给调用者。

v 步骤一:执行笛卡尔乘积(交叉联接)

  FROM子句的前两个表执行笛卡尔乘积,生成虚拟表VT1.如果左表包含n行,右表包含mVT1将包含n×m行。

v 步骤二:应用ON筛选器

  ON筛选器是可以用于查询的三个筛选器(ONWHEREHAVING)中的第一个。ON筛选器中的逻辑表达式被应用到上一步返回的虚拟表(VT1)中的所有行。只有使<联接条件>TRUE的那些行才会被包含在由步骤2返回的虚拟表(VT2)中。

三值逻辑(Three-Valued Logic)

   三值逻辑是SQL特有的,大多数的编程语言的逻辑表达式只有TRUEFALSESQL多了一个UNKNOWNSQL中的UNKNOWN通常是由包含NULL的逻辑表达式而来的(下面的三个表达式的逻辑值都UNKNOWN:NULL>42;NULL=NULL)NOT UNKNOWN的结果还是UNKNOWNUNKNOWN逻辑结果在不的语言元素中被区别对待。例如,所有的查询筛选器(ON, Where,Having)都把UNKNOWN当作FALSE处理。是筛选器为UNKNOWN的行会被排除在结果集之外。而CHECK约束中的UNKNOWN值被当作TRUE对待。假设表中包含一个CHECK约束,要求salary列的值必须大于0,想该表中插入salaryNULL的行可以被接受,因为NULL>0等于UNKNOWN,在CHECK约束中被视为和TRUE一样。UNIQUE约束、排序操作和分组操作认为两个NULL值相等。

v 步骤三:添加外部行

   这一步只与外部链接(outer join)有关。通过指定一种外部链接(left,right,full),你可以把一个或两个输入表标记为保留表。把一个表标记为保留表表示我们希望返回该表的所有行,即使<联接条件>过滤掉了一些行。左外部联接把坐标标记为保留表,以此类推。步骤3返回VT2中的行以及保留表在步骤2被过滤掉的行。保留表中的这些行被称为外部行。外部行中非保留表的属性(

TAG:

 

评分:0

我来说两句

日历

« 2024-05-01  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 25122
  • 日志数: 49
  • 建立时间: 2008-02-23
  • 更新时间: 2009-10-13

RSS订阅

Open Toolbar