搜索条件

搜索条件 指定有关给定值,行或组的 "true" , "false" 或 "unknown" 条件。 搜索条件也可以是布尔值列,值或文字。

search-condition
Read syntax diagramSkip visual syntax diagramNOTpredicateSELECTIVITYnumeric-constantANDORNOTpredicateSELECTIVITYnumeric-constant

通过将指定的 逻辑运算符 (AND , OR , NOT) 应用于每个指定谓词的结果来派生搜索条件的结果。 如果未指定逻辑运算符,那么搜索条件的结果是指定谓词的结果。

AND 和 OR 在 表 1中定义,其中 P 和 Q 是任何谓词:

表 1. AND 和 OR 的真值表
P Q P 和 Q P 或 Q
未知 未知
未知 未知
未知 未知
未知 未知
未知 未知 未知 未知

NOT (true) 为 false , NOT (false) 为 true , NOT (unknown) 为未知。

首先对括号内的搜索条件进行求值。 如果未使用括号指定求值顺序,那么将在 AND 之前应用 NOT ,并在 OR 之前应用 AND。 未定义对处于相同优先顺序级别的运算符进行求值的顺序,以允许优化搜索条件。

图 1。 搜索条件评估顺序
搜索条件评估顺序
选择性 数字常量
选择性子句用于指示谓词的期望选择性百分比。 可以为以下谓词指定选择性:
  • 用户定义的谓词,而不考虑 DB2_SELECTIVITY 查询编译器注册表变量设置
  • 一个基本谓词,其中至少一个表达式包含主变量或参数标记。 仅当 DB2_SELECTIVITY 查询编译器注册表变量设置为 YES时,对此类型谓词指定选择性才适用。
  • DB2_SELECTIVITY 查询编译器注册表变量设置为 ALL 时的任何谓词 (REGEXP_LIKE 除外)。 以下谓词允许选择性子句,但将忽略该值:
    • 基本谓词 (带有 row-value-expression)
    • Between 谓词

    在这些情况下,您必须将谓词重写为多个基本谓词,每个谓词都具有单独的选择性子句。 如果谓词由查询重写规则修改,那么不会应用选择性值。

用户定义谓词是在与 CREATE FUNCTION 的 PREDICATES 子句上的谓词规范相匹配的谓词规范的上下文中由用户定义的函数调用组成的谓词。 例如,如果使用 PREDICATES WHEN=1... 来定义函数 myfunction , 那么以下使用选择性是有效的:
   SELECT *
     FROM STORES
     WHERE myfunction(parm,parm) = 1 SELECTIVITY 0.004

选择性值必须是包含范围从 0 到 1 的数字文字值 (SQLSTATE 42615)。 如果未指定选择性,那么缺省值为 0.01 (即,期望用户定义的谓词过滤掉表中所有行中除 1% 外的所有行)。 可以通过在 SYSSTAT.ROUTINES 视图。 如果为非用户定义的谓词指定了选择性子句 (SQLSTATE 428E5) ,那么将返回错误。

用户定义的函数 (UDF) 可作为用户定义的谓词应用,因此在下列情况下可能适用于索引利用:
  • 谓词规范存在于 CREATE FUNCTION 语句中
  • 在正在比较 (语法上) 的 WHERE 子句中调用 UDF 的方式与谓词规范中指定的方式相同
  • 没有否定 (NOT 运算符)

示例

在以下查询中, WHERE 子句中的 within UDF 规范满足所有三个条件,并且被视为用户定义的谓词。
   SELECT *  
     FROM customers 
     WHERE within(location, :sanJose) = 1 SELECTIVITY  0.2
但是,由于求反, within 在以下查询中的存在不可用于索引,并且不会被视为用户定义的谓词。
   SELECT *  
     FROM customers 
     WHERE NOT(within(location, :sanJose) = 1) SELECTIVITY  0.3
在下一个示例中,请考虑识别彼此之间在一定距离内的客户和商店。 从一个商店到另一个商店的距离由客户居住的城市的半径计算。
   SELECT *  
     FROM customers, stores 
     WHERE distance(customers.loc, stores.loc) < 
       CityRadius(stores.loc) SELECTIVITY 0.02

在上述查询中, WHERE 子句中的谓词被视为用户定义的谓词。 CityRadius 生成的结果用作范围生产者函数的搜索参数。

但是,由于 CityRadius 生成的结果用作范围生产者函数,因此先前显示的用户定义谓词将无法使用 stores.loc 列上定义的索引扩展。 因此, UDF 将仅使用 customers.loc 列上定义的索引。