Два показанных здесь запроса выполняются по разному.Оба имеют одно и то же WHERE
условие, и разница заключается только в том, что синтаксис условия отличается.
Второй запрос генерируется из динамического запроса.
Дайте мне знать, если вам известна причина для одного и того же.
А также дайте мне знать, какой из них лучше всего подходит для производительности.
Запрос # 1 (выполнение занимает 1,5 секунды)
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+'%'))
Запрос # 2 (выполнение 0,016 секунды):
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,','))