同一SQL Server查询执行时间不同(其中语句相同,但语法不同)

同一SQL Server查询执行时间不同(其中语句相同,但语法不同),sql,sql-server,database,performance,sql-server-2012,Sql,Sql Server,Database,Performance,Sql Server 2012,这里显示的两个查询的执行时间不同。两者都有相同的WHERE条件,不同之处在于WHERE条件语法不同 第二个查询是从动态查询生成的 如果你知道原因,请告诉我 并让我知道哪一个是最好的表现 查询#1(执行需要1.5秒) 查询#2(执行需要0.016秒): WHERE条件中的OR子句通常是一种非常糟糕的做法,只有少数例外。 SQL优化器无法找到使用索引的好计划,因此,它必须执行完整表扫描(读取完整表)。 因此,提供的两个查询都有这种差异,在第二种情况下,当您报告速度良好时。尝试在WHERE中不带OR条

这里显示的两个查询的执行时间不同。两者都有相同的
WHERE
条件,不同之处在于WHERE条件语法不同

第二个查询是从动态查询生成的

如果你知道原因,请告诉我

并让我知道哪一个是最好的表现

查询#1(执行需要1.5秒)

查询#2(执行需要0.016秒):


WHERE条件中的OR子句通常是一种非常糟糕的做法,只有少数例外。 SQL优化器无法找到使用索引的好计划,因此,它必须执行完整表扫描(读取完整表)。
因此,提供的两个查询都有这种差异,在第二种情况下,当您报告速度良好时。尝试在WHERE中不带OR条件的情况下重新构造第一个查询,并应修复性能问题。

WHERE条件中的OR子句通常是一种非常糟糕的做法,只有少数例外。 SQL优化器无法找到使用索引的好计划,因此,它必须执行完整表扫描(读取完整表)。
因此,提供的两个查询都有这种差异,在第二种情况下,当您报告速度良好时。尝试在WHERE中不带OR条件的情况下重新格式化第一个查询,并应修复性能问题。

您必须了解以下注意事项:

  • 或者说,克劳瑟是一种非常糟糕的做法
  • 将值与NULL进行比较会影响性能
  • 具有IN的子查询的性能开销非常大

  • 您必须了解以下注意事项:

  • 或者说,克劳瑟是一种非常糟糕的做法
  • 将值与NULL进行比较会影响性能
  • 具有IN的子查询的性能开销非常大

  • where条件在我看来不一样where子句不尽相同…where是性能杀手
    (@description为NULL)还是(@description不为NULL,[description]类似“%”++@description++“%”)
    在第二个查询中?where条件在我看来不一样where子句不尽相同…在第二个查询中,
    (@description为NULL)或(@description不为NULL且[description]与“%+@description+%”类似)的性能损失在哪里?
    
    DECLARE @caseDetailId  VARCHAR(MAX) = '16',
            @patientId VARCHAR(8000) = NULL,
            @isActive NVARCHAR(4000) = NULL,
            @description NVARCHAR(4000) = NULL,
            @clientId VARCHAR(8000) = '1021',
            @machineId VARCHAR(8000) = NULL,
            @oldSystemId VARCHAR(8000) = NULL,
            @isDeleted NVARCHAR(4000) = NULL,
            @userId INT,
            @langId VARCHAR(10) = NULL,
            @page INT = 0,
            @size INT = 0,
            @orderBy VARCHAR(400) = NULL
    
    --Query 1
    SELECT * 
    FROM CaseDetail 
    WHERE 1 = 1
      AND (@isDeleted IS NULL OR [IsDeleted] = @isDeleted)
      AND (@clientId IS NULL OR [ClientId] = @clientId)
      AND (@caseDetailId IS NULL OR [CaseDetailId] IN (SELECT id 
                                                       FROM dbo.Fnsplit(@caseDetailId,',')))
      AND (@patientId IS NULL OR [PatientId] IN (SELECT id 
                                                 FROM dbo.Fnsplit(@patientId,',')))
      AND (@isActive IS NULL OR [IsActive] IN (@isActive))
      AND ((@description IS NULL )
            OR (@description IS NOT NULL AND [Description] LIKE  '%'+@description+'%'))
    
    DECLARE @caseDetailId  VARCHAR(MAX) = '16',
            @patientId VARCHAR(8000) = NULL,
            @isActive NVARCHAR(4000) = NULL,
            @description NVARCHAR(4000) = NULL,
            @clientId VARCHAR(8000) = '1021',
            @machineId VARCHAR(8000) = NULL,
            @oldSystemId VARCHAR(8000) = NULL,
            @isDeleted NVARCHAR(4000) = NULL,
            @userId INT,
            @langId VARCHAR(10) = NULL,
            @page INT = 0,
            @size INT = 0,
            @orderBy VARCHAR(400) = NULL
    
    --Query 2
    SELECT * 
    FROM CaseDetail 
    WHERE 1 = 1
      AND CaseDetail.CaseDetailId IN (SELECT Id FROM dbo.Fnsplit(@CaseDetailId,','))
      AND CaseDetail.ClientId IN (SELECT Id FROM dbo.Fnsplit(@clientId,','))