Sql 提供性能问题的超大查询

Sql 提供性能问题的超大查询,sql,performance,oracle10g,Sql,Performance,Oracle10g,数值如下: 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:。。。。整个过程都在重复 表格100至200。 我需要做的就是检查表中是否存在组合(COL1、COL2、COL3、COL4)(如果不存在,Count将返回0) 我知道这是一种非常糟糕的编写查询的方法,但我是一个新手。所以请帮忙。 谢谢为什么有这么多的联合所有的声明?我只看到谓词中的column4

数值如下:

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:。。。。整个过程都在重复

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

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

为什么有这么多的
联合所有的
声明?我只看到谓词中的
column4
值发生了变化

对于第4列,请在存在的位置尝试
。并确保对
where
子句中列出的列具有所需的索引。注意索引中的
前导列

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

另外,如果前三列没有频繁的
DML
更改,则创建一个
分区
将这些值存储在该分区中


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

您可以使用
WHERE
子句来处理公共部分。然后对
列4
部分使用
SUM
语句中的
CASE
语句:

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...
这将阻止运行所有这些单独的
SELECT
语句

确保在
COLUMN1
COLUMN2
COLUMN3
COLUMN4
上有索引也会有所帮助

编辑1:

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'
编辑2:

您可以创建另一个表,其中包含
COLUMN1
COLUMN2
COLUMN3
COLUMN4
的所有不同变体。然后
加入该表,并使用
分组方式
如下:

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

@Leocode,您完全改变了查询的复杂性。我已经编辑了我的答案,显示了如何实现您想要的。您提供的查询将返回数千列,因为表中的记录非常高。谢谢。@Leocode,这不是你想要的吗?它也应该运行得更快,对吗?如果它们是行,我可以使用它。如果ORACLE中可以使用的列数有限(我想是1000列)。:)@Leocode,我再次编辑了我的答案,为您提供了另一个选项。好的,我看到了您修改后的问题。现在有两列具有不同的值,这意味着查询谓词中的两列具有不同值的多个条件。所以,正如我在回答中所建议的,现在也包括另一列。实际上所有4列都不同。那又怎样?对所有列使用相同的建议。是什么阻止你至少尝试一下?如果你觉得有困难,我很乐意帮助你。但是,首先试着让我知道。
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