极大的查询会产生性能问题

时间:2014-10-09 14:49:25

标签: sql performance oracle10g

SELECT COUNT(*)
FROM TABLE1
WHERE COLUMN1='x1'
AND COLUMN2  ='Y1'
AND COLUMN3  = 'Z1'
AND COLUMN4  ='N1'
UNION ALL
SELECT COUNT(*)
FROM TABLE1
WHERE COLUMN1='x1'
AND COLUMN2  ='Y1'
AND COLUMN3  = 'Z1'
AND COLUMN4  ='N2' 
UNION ALL...

值如下:

X1 Y1 Z1 N1:X1 Y1 Z1 N2:....

然后,

X1 Y1 Z2 N1:X1 Y1 Z2 N2:....

然后

X1 Y2 Z1 N1:X1 Y2 Z2 N2:....

然后

X2 Y1 Z1 N1:....并且整个过程重复。

FORMS 100至200 UNION ALLS。 我需要做的就是检查表中是否存在组合(COL1,COL2,COL3,COL4)(如果不存在,则Count将返回0)。

我知道这是编写查询的一种非常糟糕的方式,但我是一个新手。所以请帮忙。 感谢

2 个答案:

答案 0 :(得分:2)

您可以使用WHERE子句来处理公共部分。然后使用隐藏在CASE语句SUM语句中的column4语句:

SELECT 
  SUM(CASE WHEN COLUMN4 = 'N1' THEN 1 ELSE 0 END) AS N1Count,
  SUM(CASE WHEN COLUMN4 = 'N2' THEN 1 ELSE 0 END) AS N2Count
FROM TABLE1
WHERE COLUMN1 = 'x1'
  AND COLUMN2 = 'Y1'
  AND COLUMN3 = 'Z1'

这会阻止所有这些单独的SELECT语句的运行。

确保您在COLUMN1COLUMN2COLUMN3COLUMN4上拥有索引也会有所帮助。

编辑1:

SELECT
  SUM(CASE WHEN
    COLUMN1 = 'X1' AND COLUMN2 = 'Y1' AND COLUMN3 = 'Z1' AND COLUMN4 = 'N1'
    THEN 1 ELSE 0 END) AS Count1,
  SUM(CASE WHEN
    COLUMN1 = 'X1' AND COLUMN2 = 'Y1' AND COLUMN3 = 'Z1' AND COLUMN4 = 'N2'
    THEN 1 ELSE 0 END) AS Count2,
  SUM(CASE WHEN
    COLUMN1 = 'X1' AND COLUMN2 = 'Y2' AND COLUMN3 = 'Z1' AND COLUMN4 = 'N1'
    THEN 1 ELSE 0 END) AS Count3,
  SUM(CASE WHEN
    COLUMN1 = 'X1' AND COLUMN2 = 'Y2' AND COLUMN3 = 'Z2' AND COLUMN4 = 'N2'
    THEN 1 ELSE 0 END) AS Count4,
  SUM(CASE WHEN
    COLUMN1 = 'X2' AND COLUMN2 = 'Y1' AND COLUMN3 = 'Z1' AND COLUMN4 = 'N1'
    THEN 1 ELSE 0 END) AS Count5,
  AND ETC.....
FROM TABLE1

编辑2:

您可以创建另一个表格,其中包含COLUMN1COLUMN2COLUMN3COLUMN4的所有不同变体形式。然后JOIN到该表并使用GROUP BY,如下所示:

SELECT tt.COLUMN1, tt.COLUMN2, tt.COLUMN3, tt.COLUMN4, 
  CASE WHEN t1.COLUMN1 IS NULL THEN 0 ELSE COUNT(1) END AS RecCount
FROM TABLE1 t1
  RIGHT JOIN TempTable tt ON tt.COLUMN1 = t1.COLUMN1, tt.COLUMN2 = t1.COLUMN2, 
                             tt.COLUMN3 = t1.COLUMN3, tt.COLUMN4 = t1.COLUMN4
GROUP BY tt.COLUMN1, tt.COLUMN2, tt.COLUMN3, tt.COLUMN4

答案 1 :(得分:0)

为什么这么多UNION ALL语句?我看到谓词中只有column4个值发生了变化。

对于column4,请尝试WHERE EXISTS。并确保您具有where子句中列出的列的必需索引。照顾索引中的leading column

通常,开发人员为所有要比较的值编写IN list。但是,由于将对IN列表中的每个值扫描table,因此效率不高。

此外,如果您不对前三列经常进行DML更改,请创建PARTITION以将这些值存储在该分区中。

而且,有任何性能调优问题,请始终提供执行计划和元数据信息。这有助于我们更好地了解您的问题。