需要建议查询优化 - DB2(LUW 9.7),Sargable Query

时间:2015-04-16 12:07:38

标签: sql db2 query-optimization

我想建议基于它优化以下视图和查询。 我们目前正在使用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),还有包含日期​​作为第一列的复合索引


  1. 将此视图设为MQT是否可能/有效,因为它包含违反MQT规则的外部联接。

  2. 可以/我应该为SAMPLE_VIEW COLUMN2创建基于CASE表达式的索引,因为它在我的查询的where子句中使用,如果是,那么如何?因为它使用多个表,这些表不能在单个CREATE INDEX查询中编入索引。

  3. 3.在我的查询中,由于UPPER功能,性能会受到阻碍。

    4.建议优化或重构我的任何代码。

    我已经在我的视图和所有表格上执行了RUNSTATS。

    目前此查询需要24分钟才能执行。

    由于

0 个答案:

没有答案