gpt4 book ai didi

sql-server - 在 sql-server 中查询所有记录都是真实的 - 明智地投入昂贵的性能

转载 作者:行者123 更新时间:2023-12-03 16:26:56 26 4
gpt4 key购买 nike

我有一个包含一列位值的表格。我想编写一个函数,如果关联项目的所有记录都为真,则返回真。

我发现的一种方法是:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com