Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запрос с динамическими параметрами  [new]
Zioma
Member

Откуда: Украина, Киев
Сообщений: 361
Прошу помощи в решении такой проблемы:

запрос вида
select
	c.ContractID
	,c.ContractNumber
	,p.ProductID
	,p.ProductName
	,pp.ProductProgrammID
	,pp.ProductProgrammName
from Contract as c
left join ProductProgramm pp on pp.ProductProgrammID = c.ProductProgrammID
left join Product p on p.ProductID = pp.ProductID
left join (select id from dbo.fnContract_SearchByNumber(@contract_filter_number)) as ids on ids.Id = c.ContractId
where ids.Id is not null


отрабатывает нормально с использованием поиска по индексу (поле ContractId таблицы Contract). Ре

А вот уже такой запрос:
select
	c.ContractID
	,c.ContractNumber
	,p.ProductID
	,p.ProductName
	,pp.ProductProgrammID
	,pp.ProductProgrammName
from [Contract] as c with (nolock)
left join ProductProgramm pp on pp.ProductProgrammID = c.ProductProgrammID
left join Product p on p.ProductID = pp.ProductID
left join (select id from dbo.fnContract_SearchByNumber(@contract_filter_number)) as ids on ids.Id = c.ContractId
where (@contract_filter_number is null or ids.Id is not null)

где @contract_filter_number параметр процедуры

начинает использовать скан по индексу таблицы Contract.

По времени: 1 сек против 30 сек.

Сервер: SQL Server 2005 SP4
6 окт 14, 11:42    [16665071]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с динамическими параметрами  [new]
Glory
Member

Откуда:
Сообщений: 104751
Zioma
где @contract_filter_number параметр процедуры

А если это будет просто переменная, а не параметр ?
6 окт 14, 12:01    [16665187]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с динамическими параметрами  [new]
Zioma
Member

Откуда: Украина, Киев
Сообщений: 361
С просто переменной также.

При чем, если использовать конструкцию
where (@contract_filter_number is null or ids.Id is not null)


скан также происходит и по связанным таблицам.

Разделять запрос на два однотипных не очень хочется, поскольку это процедура поиска с десятком параметров и уже есть разделение на два похожих запроса.
6 окт 14, 12:08    [16665246]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с динамическими параметрами  [new]
Glory
Member

Откуда:
Сообщений: 104751
А какой смысл в условии @contract_filter_number is null то ? Если на его основе работает select id from dbo.fnContract_SearchByNumber(@contract_filter_number) ?
6 окт 14, 12:11    [16665263]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с динамическими параметрами  [new]
Zioma
Member

Откуда: Украина, Киев
Сообщений: 361
Первоначально было так:
where (@contract_filter_number is null or c.ContractId in (select id from dbo.fnContract_SearchByNumber(@contract_filter_number)))


То есть, если нет поиска по номеру (@contract_filter_number is null), то выборка идет по всей таблице Contract. Если задана поисковая строка номера, то выбираются коды договоров (select id from dbo.fnContract_SearchByNumber(@contract_filter_number))) и поиск сужается до набора кодов (c.ContractId in ....)

Собственно таких конструкций "... is null or ..." порядка десяти, но проблемная только эта (другие не используют дополнительных наборов данных).
6 окт 14, 12:34    [16665414]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить