Inexact matching examples for SQL statements in optimization profiles

Inexact matching in optimization profiles occurs if you set the EXACT attribute to false in the STMTMATCH tag. The compiling statement is then matched to the statements in an active optimization profile. The compiler matches these statements based on different default matching rules and rules that are specific to inexact matching.

The following examples show where inexact matching is successful for matching SQL statements.

Example 1: Inexact matching in the predicate clause
Each of the following pair of statement fragments have different literal values for the predicate, but still match:
between '07/29/2010' and '08/29/2010' 
between '09/29/2010' and '10/29/2010'

'ab'     like :hv1
'AYYANG' like :hv2

(A=1 AND B=1)       OR (A=2 AND B=2)
(A=:hv1 AND B=:hv2) OR (A=3 AND B=3)

c1 > 0 selectivity 0.1
c1 > 0 selectivity 0.9

c1 = ?
c1 = :hv1 
Example 2: Inexact matching in the IN list predicate
All of the following statement fragments have different values in the IN list predicate, but still match:
c1 in (:hv1, :hv2, :hv3);

c1 in (:hv2, :hv3);

c1 in ( ?, ?, ?, ?);

c1 in (c1, c2 );

c1 in (:hv1, :hv2, c1, 1, 2, 3, c2, ?, ?);
Example 3: Inexact matching in the select list
The following statement fragment has different host variables in the select list, but still matches:
select c1 into :hv1 from t1
select c1 into :hv2 from t1
The following statement fragment has different literals in the select list, but still matches:
select 1, c1 from t1
select 2, c1 from t1
The following statement fragment has a different subquery in the select list, but still matches:
select c1, (select c1 from t1 where c2 = 0) from t1
select c1, (select c1 from t1 where c2 = 5) from t1
The following statement fragment has a different expression in the select list, but still matches:
select c1 + 1
select c1 + 2
Example 4: Inexact matching for different clauses
The following statement fragment has different rows for the optimize clause, but still matches:
optimize for 1 row
optimize for 10 row
The following statement fragment has different rows for the fetch clause, but still matches:
fetch first 10 rows only
fetch first 50 rows only
The following statement fragment has different literal value for the having clause, but still matches:
having c1 > 0
having c1 > 10
Each of the following pairs of statement fragments either have different column positioning for the order by clause or have different literal values for the expression in the order by clause, but still match:
order by c1+1, c2 + 2, 4
order by c1+2, c2 + 3, 4
Each of the following pairs of statement fragments either have different literal values or host variables for the set clause, but still match:
set c1 = 1
set c1 = 2

set queryno = 2
set queryno = 3

set querytag = 'query1'
set querytag = 'query2'

SET :HV00001 :HI00001 = <subquery>
SET :HV00009 :HI00009 = <subquery>
Each of the following pairs of statement fragments have different literal values for the group by clause, but still match:
group by c1 + 1
group by c1 + 2

group by 1,2,3
group by 3,2,1
Each of the following pairs of statement fragments have different literal values for the values clause, but still match:
values 1,2,3
values 3,4,5

values ( 10, 'xml', 'a' )
values ( 20, 'xml', 'ab' )
Example 5: Inexact matching for non-XML functions
Each of the following pairs of statement fragments have different literal values in the function call, but have the same number of literals and still match:
decimal(c1, 5, 2)
decimal(c1, 9, 3)

Blob('%abc%')
Blob('cde%')

max(1, 100, 200)
max(INFINITY, NAN, SNAN)
Example 6: Inexact matching for special expressions
Each of the following pairs of statement fragments have different literal values in either the case when expression or the mod expression, but still match:
order by mod(c1, 2)
order by mod(c1, 4)

case when b1 < 10 then 'A' else 'B' end 
case when b1 < 20 then 'C' else 'D' end  
Example 7: Inexact matching for the CAST function
In Db2® Version 10.5 Fix Pack 3 and later fix packs, the CAST of a literal, host variable or parameter marker matches statements with only the literal, host variable or parameter marker without the CAST function.
CAST( 'a' AS VARCHAR(5) )
CAST( 'b' AS VARCHAR(10) )

CAST( 'a' AS VARCHAR(5) )
'a'

CAST( 'a' AS VARCHAR(5) )
'b'

CAST( :myHostVar AS VARCHAR(5) )
:myHostVar

CAST( C1+1 AS VARCHAR(5) )
C1+2
Example 8: Inexact matching for the ORDER BY clause
In Db2 Version 10.5 Fix Pack 3 and later fix packs sequential column numbers are preserved under an ORDER BY clause.
ORDER BY C1, UPPER(C2), 3, 1+4
ORDER BY C1, UPPER(C2), 3, 5+6
Example 9: Inexact matching for duplicate rows in a VALUES list
In Db2 Version 10.5 Fix Pack 3 and later fix packs, duplicate rows in VALUES list where all columns consist of only one literal, host variable or parameter marker are removed before the statement text is compared.
VALUES (1,1,1), (2,2,2), …, (9,9,9)
VALUES (1,2,3)

VALUES (1+1,1,1), (2,2,2), (3,3+3,3), (4,4,4)
VALUES (5+5,5,5), (6,6+6,6)

VALUES (1,2), (C1,1), (2,2), (3,3)
VALUES (C1,4)

VALUES (C1+1,1), (C2+2,2), (3,3)
VALUES (C1+4,4), (C2+5,5)