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

标签 sql-server tsql

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

我发现的一种方法是:

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/

相关文章:

tsql - 如何检查与 object_id 关联的对象类型? (SQL Server 2012)

sql - 如何为数据库中的每个选定行执行插入

sql - 在 T SQL 中向日期添加月份

sql-server - 将大量数据从一个表插入到另一个表的最快方法是什么? (SQL Server 2005)

SQL Server Management Studio 显示数据库图表 (ER) 权限

c# - 如何从 Entity Framework DbContext 收集当前的 SQL Server session ID?

tsql - T-SQL 游标未产生预期输出

python - Superset 无法连接到我的 MSSQL 数据库

java - 需要将大型 QueryRunner 结果流式传输到文件,似乎存储在内存中

sql - 在同一查询中多次调用 CTE