如何修复以下基数估计警告?
while exists(select 1 from @images)
begin
declare @imageid int
declare @filename varchar(max)
select TOP (1)
@imageid = [imageid],
@filename = concat([imageid], '.', [extension])
from
@images
order by
[imageid]
...
delete @images where [imageid] = @imageid
end
SQL Server 兼容级别:SQL Server 2019 (150)
有时警告无非就是一个警告,而不是真正影响性能的东西。
最有可能影响您的性能的两件事是Table Variable,以及您正在循环而不是使用更具相关性的解决方案这一事实。因此,我首先运行 a
SELECT * INTO #images FROM @images
将其放入循环之前的临时表WHILE
中,然后在循环内使用该临时表,以潜在地提高性能。不过,要回答您的问题,我相信您
imageid
是INT但您在字符串函数中使用它的事实CONCAT()
是隐式转换的来源,这会导致基数估计警告。如果您将其副本存储在已转换为与字段类型相同的字符串数据类型的@images
表变量extension
中,并在函数中使用它,CONCAT()
则警告应该消失。此外,由于缺少统计信息,表变量本身通常会导致基数估计不佳,这可能是“每次执行的估计行数”显示为 1 的原因。(请注意, SQL Server 2019中有所改进。)
让我强调一下,这些类型的警告基本上是无用的,除非您真正深入查询并查看转换发生的位置。
下面会产生这样的警告,这完全是胡说八道。CAST 不会影响基数估计:
下面的警告是完全有效的,但是:
请注意,为清楚起见,我在上面的示例中使用了显式 CAST。同样的原则也适用于隐式转换。