第一章 逻辑查询处理
1、三值逻辑:True,False,Unknown
Unknown出现在包含Null值的逻辑表达式中,例如下面三个表示(NULL>42; NULL = NULL; X+NULL>Y),
另外否定的Unknown(就是 not Unknown)还是Unknown;
处理方式:所有查询筛选器(on,where,Having)把 Unknown 当 False 处理;
Check约束中当做True处理。(比如一个check约束要就salary列值必须大于0,这时如果向表插入salary
为NULL的行时可以被接受,因为NULL>0 等于Unknown 即True)
注意:(a)UNIQUE约束无法向该表插入值为NULL的两行。
(b)Order By 把NULL排列在一起,Group By 把NULL分在一起。
第三章
1、清空缓存:当需要分析查询性能,必须排除缓存的对结果的影响,需要清楚缓存中的数据与执行计划,
具体方法:a、清空楚缓中的数据 DBCC DROPCLEANBUFFERS; 就是 DBCC DropCleanBuffers
b、清空楚缓中的执行计划 DBCC FREEPROCCACHE; 就是 DBCC FreeProcCache
c、清空特定数据库的执行计划 DBCC FlushProcInDB(<db_id>); 一般不推荐使用此命令
2、语句执行I/O信息:SET Statistics IO ON, 关闭 SET Statistics IO OFF
执行SQL语句后在消息里显示格式如下:
Table 'Orders'. Scan cout 3, logical reads 536, physical reads 2, readahead reads 532,
lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
含义:表的扫描访问计数 3,从缓存读取的页数 536,从磁盘读取的页数 2 ,从磁盘预读取的页数 532,
与大型对象相关的逻辑读取数与物理读取数。
SQL 2008显示如下:扫描计数 3,逻辑读取 39513 次,物理读取 0 次,预读 0 次,
lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
3、