我想建议基于它优化以下视图和查询。 我们目前正在使用DB2 LUW 9.7
CREATE
VIEW SAMPLE_VIEW
(
COLUMN1
COLUMN2
COLUMN3
)
AS
SELECT
TABLE1.COL1 ,
CASE
WHEN TABLE2.COL2 IS NOT NULL
THEN COALESCE( TABLE2.COL3, 0)
WHEN TABLE3.COL3 IS NOT NULL
THEN COALESCE( TABLE3.COL2, 0)
ELSE COALESCE( TABLE1.COL2 , 0)
END
CASE ,
CASE
WHEN TABLE2.COL2 IS NOT NULL
THEN COALESCE(TABLE2.COL4, 0)
WHEN TABLE3.COL3 IS NOT NULL
THEN COALESCE(TABLE3.COL4, 0)
ELSE COALESCE(TABLE1.COL3, 0)
END
CASE
FROM
TAB4 TABLE4
inner join
TAB1 TABLE1
on TABLE4.COLUMN1 = TABLE1.COLUMN1
inner join TAB5 TABLE5
ON TABLE1.COLUMN1 =
TABLE5.COLUMN1
LEFT OUTER JOIN TAB6 TABLE6
ON TABLE1.COLUMN1 = TABLE6.COLUMN1
LEFT OUTER JOIN TAB3 TABLE3
ON TABLE1.COLUMN1 = TABLE3.COLUMN1
LEFT OUTER JOIN TAB2 TABLE2
ON TABLE1.COLUMN1 = TABLE2.COLUMN1
以下是使用此视图的查询
SELECT TABLE1.COLUMN1,TABLE1.COLUMN2,TABLE1.COLUMN3,
TABLE2.COLUMN1,TABLE2.COLUMN2,TABLE2.COLUMN3,
TABLE3.COLUMN1,TABLE3.COLUMN2,TABLE3.COLUMN3,
VIEW1.COLUMN1,VIEW1.COLUMN2,VIEW1.COLUMN3,
TABLE5.COLUMN1,TABLE5.COLUMN2,TABLE5.COLUMN3
FROM TAB1 TABLE1 LEFT OUTER JOIN TAB2 TABLE2 ON TABLE1.COLUMN1 = TABLE2.COLUMN1
LEFT OUTER JOIN TAB3 TABLE3 ON TABLE2.COLUMN1= TABLE3.COLUMN1
LEFT OUTER JOIN SAMPLE_VIEW VIEW1 ON TABLE3.COLUMN1 = VIEW1.COLUMN1
LEFT OUTER JOIN TAB5 TABLE5 ON TABLE5.COLUMN1 = VIEW1.COLUMN1
WHERE TABLE1.DATE >= '2013-03-03' AND TABLE1.DATE <='2013-04-03'
AND TABLE1.COLUMN3 IN ('A','B','C','D') AND
TABLE1.COLUMN2= 'Z' AND VIEW1.COLUMN2 IN ('D G', 'PQR') AND UPPER(TABLE5.COLUMN3) NOT IN ('AQM')
其他细节: 每个Column1都是主键,因此它被编入索引。 所有表包含大约700万条记录。 TABLE1上有复合索引(COLUMN1,COLUMN3,COLUMN2),还有包含日期作为第一列的复合索引
将此视图设为MQT是否可能/有效,因为它包含违反MQT规则的外部联接。
可以/我应该为SAMPLE_VIEW COLUMN2创建基于CASE表达式的索引,因为它在我的查询的where子句中使用,如果是,那么如何?因为它使用多个表,这些表不能在单个CREATE INDEX查询中编入索引。
3.在我的查询中,由于UPPER功能,性能会受到阻碍。
4.建议优化或重构我的任何代码。
我已经在我的视图和所有表格上执行了RUNSTATS。
目前此查询需要24分钟才能执行。
由于