Sql 提供性能问题的超大查询
数值如下: 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) 我知道这是一种非常糟糕的编写查询的方法,但我是一个新手。所以请帮忙。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
谢谢为什么有这么多的
联合所有的声明?我只看到谓词中的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