谓词和路径选择
谓词出现在SQL语句的WHERE、HAVING或ON子句中,用于描述数据的属性。
SQL语句的谓词会影响 Db2 选择语句的访问路径。 因为可以用不同的方式使用SQL表达相同的查询,所以了解谓词如何影响路径选择有助于编写高效访问数据的查询。
大多数谓词都是基于表格中的列。 当访问表时,它们要么对行进行排序(通过索引),要么拒绝行(由扫描返回)。 结果合格或不合格的行与为该表选择的访问路径无关。
以下查询有三个谓词: C1 上的相等谓词、 C2 上的BETWEEN谓词和 C3 上的LIKE谓词。
SELECT * FROM T1
WHERE C1 = 10 AND
C2 BETWEEN 10 AND 20 AND
C3 NOT LIKE 'A%'
当 Db2 选择访问路径时,HAVING子句中的谓词不会被使用。 这里的谓词仅指WHERE或ON子句中的谓词。 以下谓词属性会影响访问路径的选择:
- 根据其运算符或语法, 谓词的类型。
- 谓词是否可索引。
- 无论阶段是第一阶段还是第二阶段。
- 谓词是否包含行号列。
- ON子句中的谓语是否部分。
以下术语用于区分和分类某些类型的谓词:
- 简单或复合
- 复合谓词是由两个简单或复合谓词通过“与”或“或”布尔运算符连接而成的。 其他都很简单。
- 局部或连接
- 局部谓词仅引用一个表。 它们是本地表,并限制了该表返回的行数。 连接谓词涉及多个表或相关引用。 它们决定了两张或多张表中的行连接方式。
- 布尔项
- 任何复合或谓词结构中不包含的谓词都是布尔术语。 如果布尔值在特定行中为假,则整个WHERE子句在该行中也为假。
ON子句中的谓语
ON子句在外连接中提供连接条件。 对于完全外部连接,子句只能使用等值谓词。 对于其他外部连接,该子句可以使用任何谓词,但包含子查询的谓词除外。
对于内部连接,ON子句谓词可以提供连接条件和局部过滤,它们在语义上与WHERE子句谓词相同。
对于完全外部连接,ON子句在连接操作期间作为第二阶段谓词进行评估。
在外部连接中,连接后评估的谓词是第二阶段谓词。 表表达式中的谓词可以在连接之前进行求值,因此可以作为第一阶段谓词。
例如,在以下语句中,谓词 EDLEVEL
> 100 在完全连接之前进行评估,属于第一阶段谓词:
SELECT * FROM (SELECT * FROM DSN8C10.EMP
WHERE EDLEVEL > 100) AS X FULL JOIN DSN8C10.DEPT
ON X.WORKDEPT = DSN8C10.DEPT.DEPTNO;