Добрый день.
Есть запрос, который выполняется большое кол-во времени (даже примерно сказать не могу, больше 3ех минут). Таймаут на выполнение запроса стоит 1 мин, потом ее выполнение обрывается. Все индексы построены, в запрос 1 SELECT:
SELECT
p.[personId] as [personId],
--r.[innerId],
p.inn as ИНН,
ps.[firstNameRu] as [Имя рус.],
ps.[lastNameRu] as [Фамилия рус.],
ps.[middleNameRu] as [Отчество рус.],
ps.[firstNameUa] as [Имя укр.] ,
ps.[lastNameUa] as [Фамилия укр.],
ps.[middleNameUa] as [Отчество укр.],
ps.[birthday] as [Дата рождения],
p.[phone] as Телефон,
(
select comment+', ' from dbo.Reason
where personId = p.personId
for xml path('')
) as Причина,
CASE
WHEN ps.[lostDate] IS NULL THEN 0
WHEN ps.[lostDate] IS NOT NULL THEN 1
END as [Паспорт потерян],
ps.[series] as Серия,
ps.[number] as Номер,
ps.[office] as [Место выдачи],
ps.[dateReceipt] as [Дата выдачи],
p.[city] as Город,
ps.[address] as Прописка
FROM dbo.Person (NOLOCK) p
LEFT JOIN dbo.Passport (NOLOCK) ps
ON ps.personId = p.personId
WHERE
--isnull(inn,0)=isnull(@inn,isnull(inn,0))
(isnull(inn, 0) = isnull(@inn, isnull(inn,0))) AND
(isnull([firstNameRu], 0) = isnull(@firstNameRu, isnull([firstNameRu],0))) AND
(isnull([lastNameRu], 0) = isnull(@lastNameRu, isnull([lastNameRu],0))) AND
(isnull([middleNameRu], 0) = isnull(@middleNameRu, isnull([middleNameRu],0))) AND
(isnull([firstNameUa], 0) = isnull(@firstNameUa, isnull([firstNameUa],0))) AND
(isnull([lastNameUa], 0) = isnull(@lastNameUa, isnull([lastNameUa],0))) AND
(isnull([middleNameUa], 0) = isnull(@middleNameUa, isnull([middleNameUa],0))) AND
((@birthday is null) or (ps.[birthday] = @birthday)) AND
(isnull([phone], 0) = isnull(@contactPhone, isnull(phone,0))) AND
----(@reason is null) or (
---- CONTAINS((
---- select comment+', ' from dbo.Reason
---- where personId = p.personId
---- for xml path('')
---- ), @reason)
----)) AND
--(@PassportLost is null) or
--(
--(CASE
-- WHEN ps.[lostDate] IS NULL THEN 0
-- WHEN ps.[lostDate] IS NOT NULL THEN 1
--END) = @PassportLost
--) AND
(isnull([series], 0) = isnull(@passportSeries, isnull([series],0))) AND
(isnull([number], 0) = isnull(@passportNumber, isnull([number],0))) AND
(isnull([office], 0) = isnull(@ktoVidal, isnull([office],0))) AND
((@PassportReceivingDate is null) or ( [dateReceipt] = @PassportReceivingDate)) AND
(isnull([city], 0) = isnull(@City, isnull([city],0))) AND
(isnull([address], 0) = isnull(@PassportAdress, isnull([address],0)))
Смысл запроса: у нас есть 2 связанные таблицы и большое число параметров. по которым может производиться отбор (всего около 15 параметров, причем могут быть заданы не все, а например только 1 фильтр, или 2 и 3ий)
Подскажите, пожалуйста, как можно оптимизировать запрос?
Спасибо
План выполнения запроса показал, что 60% идет поиск в таблице Person:
Ответ
Я переписал запрос, и сделал его динамическим. Решило все проблемы. Всем спасибо.
Комментариев нет:
Отправить комментарий