我有一个包含一列位值的表格。我想编写一个函数,如果关联项目的所有记录都为真,则返回真。
我发现的一种方法是:
Select @Ret = CAST(MIN(CAST(IsCapped as tinyInt)) As Bit)
from ContractCover cc
Inner join ContractRiskVersion crv on cc.ContractRiskId = crv.ContractRiskId
WHERE crv.ContractVersionId = @ContractVersionId
AND cc.IsActive = 1
return @ret
但是转换为 int 以获得最小值是否昂贵?我是否应该只是基于 say 进行查询:
(count(Id) where IsCapped = 0 > 0) 返回 false 而不是进行多次转换?
在执行计划中调用这个函数似乎在执行中并不重要(但我不太熟悉分析查询计划 - 它似乎与存储过程的另一部分具有相同的百分比成本大约 2%)。
编辑 - 当我执行调用函数的存储过程并查看执行计划时 - 它调用函数的部分具有查询成本(相对于批处理):1%,这与其他部分相当存储过程除非我看错了:)
谢谢!!
最佳答案
我会使用 exists 语句执行此操作,因为它会在找到 1 条记录时跳出查询,其中 IsCapped = 0
因为您的查询将始终读取所有数据。
CREATE FUNCTION dbo.fn_are_contracts_capped(@ContractVersionId int)
RETURNS bit
WITH SCHEMABINDING
AS
BEGIN
DECLARE @return_value bit
IF EXISTS(
SELECT 1
FROM dbo.ContractCover cc
JOIN dbo.ContractRiskVersion crv
ON cc.ContractRiskId = crv.ContractRiskId
WHERE crv.ContractVersionId = @ContractVersionId
AND cc.IsActive = 1
AND IsCapped = 0)
BEGIN
SET @return_value = 0
END
ELSE
BEGIN
SET @return_value = 1
END
RETURN @return_value
END
相对于读取数据所需的IO,强制转换不会增加很多开销。
编辑:将代码包装在标量函数中。
关于sql-server - 在 sql-server 中查询所有记录都是真实的 - 明智地投入昂贵的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10846153/