Monday, December 10, 2012

DB2 Stage and Indexable Predicates

很多人在写sql或者做优化的时候经常会想,什么样的where语法对于数据是比较友好的呢?什么样的语法才能更好使用索引呢?  对于这个问题IBM的开发指导的书上给出了下面这个列表,个人感觉很有用,特别是对于SQL优化新手。


Stage 1 and Indexable Predicates
Predicate Type Stage Indexable
COL = 1 Yes
COL = non-col expr 1 Yes
COL IS NULL 1 Yes
COL IS NOT NULL 1 Yes
COL op value 1 Yes
COL op non-col expr 1 Yes
COL BETWEEN value1 AND value 2 1 Yes
COL BETWEEN non-col expr1 AND non-col expr2 1 Yes
COL BETWEEN expr1 and expr2 1 Yes
COL LIKE ‘pattern’ 1 Yes
COL LIKE :HV 1 Yes
COL IN (list) 1 Yes
COL IN (non subq) 1 Yes
T1.COL = T2.COL 1 Yes
T1.COL op T2.COL 1 Yes
COL = (non subquery) 1 Yes
COL op (non subquery) 1 Yes
COL op ANY (non subquery) 1 Yes
COL op ALL (non subquery) 1 Yes
COL = expression 1 Yes
(COL1,…COLn) IN (non subquery) 1 Yes
(COL1,…COLn) = (val1,…valn) 1 Yes
T1.COL = T2.col expr 1 Yes
COL IS NOT DISTINCT FROM value 1 Yes
COL IS NOT DISTINCT FROM non-col expr 1 Yes
COL IS NOT DISTINCT FROM col expr 1 Yes
COL IS NOT DISTINCT FROM non subquery 1 Yes
COL IS NOT DISTINCT FROM T2.COL 1 Yes
COL IS NOT DISTINCT FROM T2.col expr 1 Yes
Stage 1 and Nonindexable Predicates
Predicate Type Stage Indexable
COL <> value 1 No
COL <> non-col expr 1 No
COL NOT BETWEEN value1 AND value2 1 No
COL NOT BETWEEN non-col expr1 AND non-col expr2 1 No
COL NOT IN (list) 1 No
COL NOT LIKE ‘ char’ 1 No
COL NOT LIKE ‘%char’ 1 No
COL NOT LIKE ‘_char’ 1 No
T1.COL <> T2.COL 1 No
T1.COL1 = T1.COL2 1 No
COL <> (non subquery) 1 No
COL IS DISTINCT FROM 1 No
注:
op操作符下列其一:<=, >=, <, >, or <>
non-col expr是指不包含表中字段的任意表达式
Stage 1可以使用and、or、not进行组合
除了上述表格中的Stage 1,不在包含内的都为Stage 2,程序可以认为是Stage 3

No comments:

Post a Comment