同一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条件的情况下重新格式化第一个查询,并应修复性能问题。您必须了解以下注意事项:
您必须了解以下注意事项:
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,','))