SQL查询中的行数



我继承了一个永恒运行的SQL查询,我试图通过消除冗余的谓词来提高查询性能。

例如,基表如下所示

| itemNo | itemType    |
|--------|-------------|
| 1000   | camera      |
| 1000   | camera      |
| 1000   | camera      |
| 1001   | mobilePhone |
| 1002   | VR gear     |
| 1003   | other       |

和SQL查询包含像这样的谓词(实际上它包含许多冗余谓词)。在这种情况下,这个特定的谓词是无用的,因为itemNo永远不能超过4位,因为它是应用于数据级别的限制。

select distinct itemNo, itemType
from @src 
where datalength(itemNo)=4

我需要仔细地一个接一个地消除谓词,并希望将总行数与基本查询和删除谓词后进行比较,以确定删除谓词as long as the row count is the same before and after removal是否安全.

是否有任何方法可以在不需要SQL首先执行基本查询的情况下获得特定查询的总行数?因为查询现在花费了45分钟,我希望避免等待那么长时间才能看到基本查询的总行数。

我知道,我能做到

select @@ROWCOUNT,但它也在给出结果之前先执行查询。

这是我尝试过的

declare @src as table (itemNo integer, itemType varchar(max));
insert into @src
select * from
(values(1000,'camera'),(1000,'camera'), (1000,'camera'), (1001,'mobilePhone'),(1002,'VR gear'),(1003,'other')) t(a,b)
--base query
select distinct itemNo, itemType
from @src 
where datalength(itemNo)=4
select @@ROWCOUNT
/* this does not work
select COUNT(distinct itemNo, itemType)
from @src 
where datalength(itemNo)=4
*/

SELECT @@VERSION=Microsoft SQL Server 2016

我遇到过类似的情况,但我不确定它是否对你有帮助。

在我的情况下,我有几个不同的WHERE子句条件,如:

datalength(itemNo)=4

Column2 IS NOT NULL

Column1 IS NOT NULL AND Column1 < 100

Column1 > 12

我想做的是单独运行每个元素,并计算每个元素的结果。

所以我做的是,我使用这个免费的SQL生成器为我生成SQL:

SELECT 'datalength(itemNo)=4' AS rule_desc, COUNT(DISTINCT Column1) as QTY 
FROM src 
WHERE datalength(itemNo)=4
UNION ALL
SELECT 'datalength(itemNo)=4 AND Column1 > 12' AS rule_desc, COUNT(DISTINCT Column1) as QTY 
FROM src 
WHERE datalength(itemNo)=4 AND Column1 > 12
UNION ALL
SELECT 'datalength(itemNo)=4 AND Column1 > 12 AND Column2 IS NOT NULL' AS rule_desc, COUNT(DISTINCT Column1) as QTY 
FROM src 
WHERE datalength(itemNo)=4 AND Column1 > 12 AND Column2 IS NOT NULL
UNION ALL
SELECT 'datalength(itemNo)=4 AND Column1 > 12 AND Column2 IS NOT NULL AND Column1 IS NOT NULL AND Column1 < 100' AS rule_desc, COUNT(DISTINCT Column1) as QTY 
FROM src 
WHERE datalength(itemNo)=4 AND Column1 > 12 AND Column2 IS NOT NULL AND Column1 IS NOT NULL AND Column1 < 100

写这个SQL会很耗时,但是Rasgo工具会为你生成SQL。您只需要在右侧设置表结构,然后添加WHERE条件。

另一种可能的情况是,让它生成所有规则的组合,所以它会将所有4个条件组合成3,2,1个条件的每种可能组合。这显然会使您的SQL崩溃,这取决于您有多少谓词。

相关内容

  • 没有找到相关文章

最新更新