Один и тот же запрос SQL Server, выполняемый в разное время (где оператор одинаковый, но синтаксис другой) - PullRequest
0 голосов
/ 24 декабря 2018

Два показанных здесь запроса выполняются по разному.Оба имеют одно и то же 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,','))

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Вы должны знать следующее:

  1. ИЛИ в WHERE clauser - очень плохая практика.
  2. Сравнение значения с NULL повлияло на производительность.
  3. Sub Query with IN очень сильно загружает производительность.
0 голосов
/ 24 декабря 2018

Предложение OR в условии WHERE в целом является очень плохой практикой, за некоторыми исключениями.Оптимизатор SQL не может найти хороший план для использования индекса, поэтому он должен выполнить полное сканирование таблицы (прочитайте полную таблицу).Таким образом, оба предоставленных запроса имеют эту разницу, и во втором случае вы сообщаете о хорошей скорости.Попробуйте переформулировать первый запрос без условий ИЛИ в WHERE и устранить проблему с производительностью.

...