谓词处理摘要
您可以通过指定在早期阶段评估的谓词来提高SQL语句的性能。
处理订单
谓语按以下顺序分阶段应用:
- 当访问索引时,将应用并评估与索引键列匹配的可索引谓词。
- 第一阶段索引筛选谓词未被选为索引匹配谓词,但仍引用索引列,这些谓词将应用于索引。
- 阶段1 页面范围筛选谓词引用分区列来限制访问的分区数量。
- 在访问数据页面后,其他阶段1谓词将应用于数据。
- 阶段2的谓词应用于返回的数据行。
DSN_FILTER_TABLE的STAGE列表示谓词应用的阶段。
在可转位阶段之后的每个阶段,谓词按类型按以下顺序应用:
- 相等谓词(包括仅包含一个项目的IN谓词和包含相同值两次的BETWEEN谓词)
- 范围谓词和列的谓词形式为“列不为空”
- 其他谓词类型
在应用了这两套规则后,谓词将按照其在查询中的出现顺序进行评估。 因为您指定了顺序,所以您对评估顺序有一定的控制权。 然而,无论编码顺序如何,非关联子查询总是先于关联子查询进行计算,除非 Db2 对子查询进行关联、去关联或转换为联接。
谓词类型和阶段处理
一般来说,如果用OR运算符将几个简单谓词组合成一个复合谓词,运算结果与最后评估的简单谓词具有相同的特征。 例如,如果两个可索引谓词与OR运算符结合,结果就是可索引的。 如果阶段1的谓词和阶段2的谓词用OR运算符连接,则结果为阶段2。
- 可替换和阶段1谓词 31
- 在索引筛选期间或第一阶段处理期间的数据页面访问之后,可以通过匹配索引访问来评估以下谓词。
COL = value16 , 31COL = noncol expr9, 11, 12, 15, 29, 31, 32COL IS NULL20, 21COL op value13 , 31COL op noncol expr9, 11, 12, 13, 29, 31, 32value BETWEEN COL1 AND COL213 , 32COL BETWEEN value1 AND value2十三COL BETWEEN noncol expr 1 AND noncol expr 29, 11, 12, 13, 23, 29COL BETWEEN expr-1 AND expr-26, 7, 11, 12, 13, 14, 15, 27, 29COL LIKE 'pattern'29COL IN (list)17 , 18COL IS NOT NULL21COL LIKE host variable2, 29COL LIKE UPPER ('pattern')29COL LIKE UPPER (host-variable)2, 29COL LIKE UPPER (SQL-variable)2, 29COL LIKE UPPER (global-variable)2, 29COL LIKE UPPER (CAST ('pattern' AS data-type))2, 29COL LIKE UPPER (CAST (host-variable AS data-type))2, 29COL LIKE UPPER (CAST (SQL-variable AS data-type))2, 29COL LIKE UPPER (CAST (global-variable AS data-type))2, 292, 29T1.COL = T2.COLT1.COL op T2.COLT1.COL = T2 col expr6, 9, 11, 12, 14, 15, 25, 27, 29T1.COL op T2 col expr6, 9, 11, 12, 13, 14, 15, 29COL = (noncor subq)COL op (noncor subq)28COL = ANY (noncor subq)22 , 29(COL1,...COLn) IN (noncor subq)29COL = ANY (cor subq)19, 22, 29COL IS NOT DISTINCT FROM value十六COL IS NOT DISTINCT FROM noncol expr9, 11, 12, 15, 29T1.COL1 IS NOT DISTINCT FROM T2.COL23 , 4T1.COL1 IS NOT DISTINCT FROM T2 col expr6, 9, 11, 12, 14, 15, 29COL IS NOT DISTINCT FROM (noncor subq)SUBSTR(COL,1,n) = valueSUBSTR(COL,1,n) op valueDATE(COL) = value33DATE(COL) op value33YEAR(COL) = value33YEAR(COL) op value33
- 第一阶段不可索引谓词 31
- 以下谓词可能会在第一阶段处理、索引筛选或数据页面访问后评估。
COL <> value8 , 11COL <> noncol expr8, 11, 29COL NOT BETWEEN value1 AND value2COL NOT IN (list)COL NOT LIKE ' char'29COL LIKE '%char'1, 29COL LIKE '_char'1, 29T1.COL <> T2 col expr8、 11 、27 、29COL op ANY (noncor subq)22COL op ALL (noncor subq)COL IS DISTINCT FROM value8 , 11COL IS DISTINCT FROM (noncor subq)
- 阶段 2 谓词
- 在第二阶段,数据返回后,必须处理以下谓词。
COL BETWEEN COL1 AND COL210value NOT BETWEEN COL1 AND COL2- col expr 和 col expr 之间的值 32
T1.COL <> T2.COLT1.COL1 = T1.COL23 , 25T1.COL1 op T1.COL23T1.COL1 <> T1.COL23COL = ALL (noncor subq)COL <> (noncor subq)22COL <> ALL (noncor subq)COL NOT IN (noncor subq)COL = (cor subq)五COL = ALL (cor subq)COL op (cor subq)五COL op ANY (cor subq)22COL op ALL (cor subq)COL <> (cor subq)五COL <> ANY (cor subq)十九(COL1,...COLn) IN (cor subq)COL NOT IN (cor subq)(COL1,...COLn) NOT IN (cor subq)T1.COL1 IS DISTINCT FROM T2.COL23T1.COL1 IS DISTINCT FROM T2 col expr8 , 11COL IS NOT DISTINCT FROM (cor subq)EXISTS (subq)十九expression = value27, 32expression <> value27expression op value27, 32expression op (subq)NOT XMLEXISTSCASE expression WHEN expression ELSE expression END = value32
- 可替换,但不是第一阶段的前提条件
- 下列谓词可以在索引访问期间处理,但不能在阶段1处理。
XMLEXISTS26
注:
- 仅当在LIKE谓词中指定并使用转义字符时,索引才可用。 例如,COL LIKE '+%char ' ESCAPE '+' 是可以索引的。
- 仅当变量中的模式为可索引常量时(例如,变量='char%' )才能索引。
- 如果 COL1 和 COL2 来自同一张表,则这些谓词不考虑通过任一表的索引进行访问。 但以下查询是个例外:
通过使用关联名称,查询将一个表视为两个单独的表。 因此, C1 和 C2 列的索引可供访问。SELECT * FROM T1 A, T1 B WHERE A.C1 = B.C2; - 如果两边包含相同的数据类型,则谓词可能是可索引的,并且是第一阶段。 否则,谓语为第二阶段。
- 如果子查询已经针对给定的相关值进行了评估,则无需重新评估子查询。
- 连接序列左侧的列必须与连接序列右侧的任何列位于不同的表中。
- 表格中包含 expression1 或 expression2 的表格必须已经访问过。
- WHERE NOT COL = value 的处理方式与WHERE COL <> value 的处理方式相同,以此类推。
- 如果非列表达式 noncol expr、 非列表达式 noncol expr1 或非列表达式 noncol expr2 属于上述形式之一,则谓词不可索引:
- 非颜色表达式 + 0
- 非颜色表达式 - 0
- 非颜色表达式 * 1
- 非颜色表达式 /1
- 非空表达式 CONCAT 空字符串
- COL、 COL1 和 COL2 可以是同一列,也可以是不同的列。 这些列在同一张表中。
- 以下任何一组条件都符合第二阶段的要求:
- 谓词评估之前获得的第一个值是 BIGINT 或 DECIMAL( p, s ),其中 p >15,谓词评估之前获得的第二个值是 REAL 或 FLOAT。
- 在谓词被评估之前获得的第一个值是CHAR、VARCHAR、GRAPHIC或VARGRAPHIC,在谓词被评估之前获得的第二个值是DATE、TIME或TIMESTAMP。
- 谓词是阶段1,但不可索引,如果谓词评估前获得的第一个值是CHAR或VARCHAR,谓词评估前获得的第二个值是GRAPHIC或VARGRAPHIC,且谓词评估前获得的第一个值不是Unicode混合。
- 如果比较的两边都是字符串,则以下任意一组条件都会使谓词处于阶段1,但不可索引:
- 在谓词被评估之前,第一个获得的值是CHAR或VARCHAR,第二个获得的值是GRAPHIC或VARGRAPHIC。
- 以下两个条件均成立:
- 比较的两边都是CHAR或VARCHAR,或者比较的两边都是BINARY或VARBINARY
- 在谓词被评估之前,第一个值的长度小于在谓词被评估之前第二个值的长度。
- 以下两个条件均成立:
- 比较的双方都是图形或变图形。
- 在谓词被评估之前,第一个值的长度小于在谓词被评估之前第二个值的长度。
- 以下两个条件均成立:
- 在谓词被评估之前,第一个获得的值是 GRAPHIC 或 VARGRAPHIC,第二个获得的值是 CHAR 或 VARCHAR。
- 在谓词被评估之前,第一个值的长度小于在谓词被评估之前第二个值的长度。
- 如果比较的两边都是字符串,但两边具有不同的CCSID,则谓词为阶段1,且只有在谓词求值之前获得的第一个值是Unicode且比较不符合注释13中的任何条件时,谓词才可索引。
- 如果以下所有条件均成立,则谓词为第二阶段:
- col expr 或 noncol expr 是一个整数值,是两个非列表达式的乘积或商
- COL是浮点数或十进制列
- 如果COL具有ROWID数据类型,则 Db2 会尝试使用直接行访问,而不是索引访问或表空间扫描。
- 如果COL具有ROWID数据类型,并且在COL上定义了索引,则 Db2 会尝试使用直接行访问而不是索引访问。
- 如果满足以下条件,则IN列表谓词可索引且处于阶段1:
- IN列表仅包含简单项目。 例如常量、宿主变量、参数标记和特殊寄存器。
- IN列表不包含任何聚合函数或标量函数。
- 触发器的“何时”子句中不包含“IN”列表。
- 对于左侧列为小数且精度大于15的数字谓词,IN列表中的所有项都不是浮点数。
- 对于字符串谓词,编码字符集标识符与左侧列的标识符相同。
- 对于DATE、TIME和TIMESTAMP谓词,左侧一栏必须为DATE、TIME或TIMESTAMP。
- 某些谓词可能会根据其在处理过程中的变化而成为可索引和第一阶段的内容。
- 当查询定义为非空值的列时,谓词类型COL IS NULL和COL IS NOT NULL属于第二阶段谓词。
- 如果谓词类型为COL IS NULL,而列被定义为NOT NULL,则无法访问该表,因为 C1 不能为NULL。
- “任何”和“一些”这两个关键词的用法类似。 如果带有ANY关键字的谓词不可索引且不属于第一阶段,那么带有SOME关键字的类似谓词也不可索引且不属于第一阶段。
- 在上述两种情况下,第二阶段都是:
- 非颜色表达式是一个案例表达式。
- 非列表达式是两个非列表达式的乘积或商,该乘积或商是一个整数值,而列是浮点列或十进制列。
- COL IN (非核心子级) 仅适用于N型访问的第一阶段。 否则,就是第二阶段。
- 如果内表是EBCDIC或ASCII列,外表是Unicode列,则谓词为阶段1且可索引。
- XMLEXISTS 始终处于第二阶段。 但是,如果可以使用XML索引来评估谓词中的XPath表达式,则相同的谓词可以被索引并成为匹配谓词。 XMLEXISTS 谓词永远不能作为筛选谓词。
- 如果谓词包含作为列引用的表达式、调用内置函数或包含一般表达式,则可以通过基于表达式的索引进行索引。
- 当可能发生空值不匹配时,这种谓词不属于第一阶段。
- 如果COL由字段过程定义,则谓词成为阶段2。
- 如果两列具有相同的数据类型、长度和编码方案,则此类谓词可能符合页面范围筛选条件。
- 如果只有右侧包含DECFLOAT数据类型,则以下谓词可能是可索引的,并且是第一阶段:
COL = valueCOL = noncol exprCOL op valueCOL op noncol expr
- 如果表达式包含以下标量函数之一,则谓词可能是可索引的:
- 日期
- 年
- SUBSTR(如果子字符串 的起始值为1。)
- COL是日期、时间或时间戳列。
在上述示例谓词中使用了以下缩写和变量值:
- char
- 任何字符串,不包括百分号(%)或下划线(_)的特殊字符。
- COL
- 列名。
- col expr
- 列表达式。
- 皮下组织
- 相关子查询
- 表达式
- 任何包含算术运算符、标量函数、聚合函数、连接运算符、列、常量、宿主变量、特殊寄存器或日期或时间表达式的表达式。
- 非颜色表达式
- 非列表达式,即不包含列的任何表达式。 该表达式可以包含算术运算符、标量函数、连接运算符、常量、宿主变量、特殊寄存器或日期或时间表达式。
非列表达式的一个例子是
CURRENT DATE - 50 DAYS - 非核心子句
- 一个非相关的子查询
- op
- 任何运算符 >、>=、<、<=、¬>、¬<
- 判定式
- 任何类型的谓词。
- 模式
- 任何不以特殊字符百分号 (%) 或下划线 (_) 开头的字符串。
- 皮下
- 相关或非相关的子查询
- Tn
- 一个表名。
- Tn col expr
- 在表Tn中包含一列的表达式。 这句话可能只出现在那一栏。
- 值
- 常量、宿主变量或特殊寄存器。