2016-05-17 105 views
-2

Oracle模式:如何使SQL性能得到改进?

tableA 
AA varchar2 PK  
BB number  PK          
CC varchar2 PK  
DD number  PK  
EE number 

SQL查询:

SELECT 
    X1.AA, 
    X1.CC, 
    X1.DD, 
    tableA.EE 
FROM 
    tableA, 
    (SELECT 
     AA, 
     CC, 
     MAX(tableA.DD) DD 
    FROM 
     tableA 
    WHERE 
     (tableA.BB = 7 OR tableA.BB = 1) AND 
     tableA.EE <> 1 
    GROUP BY 
     AA, 
     CC 
    ORDER BY 
     AA ASC, 
     CC DESC 
    ) X1, 
    (SELECT 
     AA, 
     MAX(tableA.CC) CC 
    FROM 
     tableA 
    WHERE 
     (tableA.BB = 7 OR tableA.BB = 1) AND 
     tableA.EE <> 1 
    GROUP BY 
     AA 
    ORDER BY 
     AA ASC 
    ) X2 
WHERE 
    X2.AA = X1.AA AND 
    X2.CC = X1.CC AND 
    X2.AA = tableA.AA AND 
    X2.CC = tableA.CC AND 
    X1.DD = tableA.DD 
ORDER BY 
    AA ASC 
+3

无法读取此内容。做一个解释计划并寻找桌面扫描。如果你看到一个,这就是这个查询很慢的原因。 – duffymo

+0

可能在某处创建索引? –

+1

从X1和X2子查询中删除ORDER BY。它们是徒劳的 – StanislavL

回答

1

我明白X1和X2表用于仅MAX值滤波。在这种情况下,查询可以使用窗口功能被改写:

SELECT AA, CC, DD, EE 
FROM (
    SELECT * 
     , MAX(CC) OVER (PARTITION BY AA ) As maxCC 
     , MAX(DD) OVER (PARTITION BY AA, CC) As maxDD 
    FROM tableA 
    WHERE BB In (1, 7) AND EE <> 1 
) A 
WHERE CC = maxCC AND DD = maxDD; 

这将节省一对夫妇的子查询,每个自己的过滤加入。

更新:考虑到Gordon Linoff的评论这样可以更准确地被改写为:

SELECT AA, CC, DD, EE 
FROM tableA 
WHERE (AA, CC, DD) IN (
    SELECT DISTINCT AA 
     , MAX(CC) OVER (PARTITION BY AA ) As CC 
     , MAX(DD) OVER (PARTITION BY AA, CC) As DD 
    FROM tableA 
    WHERE BB In (1, 7) AND EE <> 1 
); 
+1

这是一个很好的解释。 。 。并且很可能是OP *真正想要的。但是,它与OP的查询不同,因为该查询在外部查询中没有过滤。 –

+0

非常感谢您的回复。 – eww

2

这是基于查询的YB的解释,这是对赛道非常大概什么OP真的很想要。但是,它会过滤正在输出的行。相反,过滤器只需要移动以计算最大值:

SELECT AA, CC, DD, EE 
FROM (SELECT a.*, 
      MAX(CASE WHEN BB In (1, 7) AND EE <> 1 THEN CC END) OVER 
       (PARTITION BY AA) As maxCC, 
      MAX(CASE WHEN BB In (1, 7) AND EE <> 1 THEN DD END) OVER 
       (PARTITION BY AA, CC) As maxDD 
     FROM tableA a 
    ) a 
WHERE CC = maxCC AND DD = maxDD; 
+0

这确实是一个更准确的重写。虽然不确定使用'CASE'的性能优势。 –

+0

非常感谢您的答复。 – eww

+0

@ Y.B。 。 。 。问题不在于表现。我相信这符合OP的原始逻辑。你的版本对我来说更有意义,但逻辑是微妙的不同。 –