我继承了一个永恒运行的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崩溃,这取决于您有多少谓词。