谓词和路径选择

谓词出现在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;

结束特定程序编程接口信息。