Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Пожалуйста помогите с оптимизацией условия в запросе  [new]
тестир
Guest
if parameter1=All and parameter2=All
then select * from t1 where parameter1=All and parameter2=All


if parameter1=конкретное значение and parameter2=All
then select * from t1 where where parameter1=конкретное значение and parameter2=All


if parameter1=конкретное значение and parameter2=конкретное значение
then select * from t1 where parameter1=конкретное значение and parameter2=конкретное значение


Можно ли написать 1 запросом ?

Спасибо
23 янв 15, 08:20    [17157444]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста помогите с оптимизацией условия в запросе  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
declare @parameter1 int -- тип условно
declare @parameter2 int -- тип условно
-- если параметр не установлен = null выбираются все значения
-- если параметр установлен = value выбираются строки со значением параметра = value
-- например
set @parameter1 = null
set @parameter2 = 5
-- запрос
select * from t1
where (parameter1 = @parameter1 or @parameter1 is null)
  and (parameter2 = @parameter2 or @parameter2 is null)
23 янв 15, 08:40    [17157483]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста помогите с оптимизацией условия в запросе  [new]
тестир
Guest
LexusR,
Большое спасибо
23 янв 15, 10:16    [17157943]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста помогите с оптимизацией условия в запросе  [new]
тестир
Guest
тестир,

А можно уточнить, если место null писать 0
есть подводные камни?
23 янв 15, 10:23    [17157976]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста помогите с оптимизацией условия в запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
тестир
есть подводные камни?

Есть. @parameter1 is null не будет работать
23 янв 15, 10:25    [17157988]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста помогите с оптимизацией условия в запросе  [new]
тестир
Guest
Glory,

Разумеется если во всех параметрах использовать 0

Просто Null не всегда бывает, я спрашиваю в глобальном смысле
23 янв 15, 10:55    [17158171]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста помогите с оптимизацией условия в запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
тестир
Просто Null не всегда бывает, я спрашиваю в глобальном смысле

Ваш "глобальный" непонятен
Вы српашиваете, чем отличается 0 от null ?
Или что выполняется быстрее - @parameter1 is null или @parameter1 = 0 ?
23 янв 15, 10:57    [17158188]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста помогите с оптимизацией условия в запросе  [new]
ModelR
Member

Откуда: Нижний Новгород
Сообщений: 1798
LexusR
select * from t1
where (parameter1 = @parameter1[b] or @parameter1 is null[/b])
  and (parameter2 = @parameter2 or @parameter2 is null)


Могут быть проблемы с производительностью. Скорее всего приведет к полному сканированию вместо index seek. С точки зрения производительности лучше использовать динамический sql. https://msdn.microsoft.com/ru-ru/library/ms188001(v=sql.90).aspx

типа
declare @parameter1 int -- тип условно
declare @parameter2 int -- тип условно
-- если параметр не установлен = null выбираются все значения
-- если параметр установлен = value выбираются строки со значением параметра = value
-- например
set @parameter1 = null
set @parameter2 = 5

-- запрос динамически
declare @cmd nvarchar(max) = 'select * from t1
		where '
		+ case when @parameter1 is not null then 'parameter1 = @p1'
			else '' end
		+ case when @parameter2 is not null then 'parameter2 = @p2'
			else '' end	;
exec sp_executesql @cmd, N'@p1 int, @p2 int', @parameter1, @parameter2;
23 янв 15, 12:51    [17159039]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста помогите с оптимизацией условия в запросе  [new]
ModelR
Member

Откуда: Нижний Новгород
Сообщений: 1798
точнее
 
declare @cmd nvarchar(max) = 'select * from t1
        where 1=1 '
		+ case when @parameter1 is not null then 'and parameter1 = @p1'
			else '' end
		+ case when @parameter2 is not null then 'and parameter2 = @p2'
			else '' end	;
23 янв 15, 12:55    [17159083]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста помогите с оптимизацией условия в запросе  [new]
тестир
Guest
ModelR,

спасибо очень интересный вариант, щас попробую сравнить с уже работающим, который написал LexusR

Что сразу удивило "where 1=1"

Зачем?
23 янв 15, 17:48    [17161522]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста помогите с оптимизацией условия в запросе  [new]
тестир
Guest
тестир,

sql 2000

declare @cmd AS nvarchar(max)
DECLARE @parameter2 AS int
set @parameter2 = 35


set @cmd = 'SELECT top 1 * FROM T1 where 1=1 and '
+ case when @parameter2 is not null then 'id = @parameter2'
else '' end

exec (@cmd)


Must declare the scalar variable "@parameter2".
23 янв 15, 18:54    [17161741]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста помогите с оптимизацией условия в запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
тестир
Must declare the scalar variable "@parameter2".

И что не понятно из сообщения ?
В вашем запросе пакете не объявлена переменная
24 янв 15, 19:50    [17164608]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста помогите с оптимизацией условия в запросе  [new]
тестир
Guest
Glory,

вот же объявил
DECLARE @parameter2 AS int

declare @cmd AS nvarchar(max)
DECLARE @parameter2 AS int
set @parameter2 = 35
26 янв 15, 11:36    [17169489]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста помогите с оптимизацией условия в запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
тестир
вот же объявил
DECLARE @parameter2 AS int

А какое отношение это объявление имеет к запросу в @cmd ?
26 янв 15, 11:38    [17169501]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста помогите с оптимизацией условия в запросе  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
тестир
вот же объявил
Где? Снаружи динамического запроса? А внутри он откуда возьмётся?
26 янв 15, 11:38    [17169505]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста помогите с оптимизацией условия в запросе  [new]
тестир
Guest
А как тогда его написать внутри динамического sql

я пытался exec (@cmd)@parameter2
26 янв 15, 11:58    [17169620]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста помогите с оптимизацией условия в запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
тестир
А как тогда его написать внутри динамического sql

Скрипт внутри переменной пишется пишется по тем же правилам, что и снаружи переменной.
Только во втором случае вы пишите его руками, а первом случае автоматизируете процесс написания с скрипта.
26 янв 15, 12:03    [17169667]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста помогите с оптимизацией условия в запросе  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
вообще то предложенная идея динамического запроса спорна но уж если вы хотите попробовать exec(sql) то писать можно так
declare @cmd AS nvarchar(max)
DECLARE @parameter2 AS int 
set @parameter2 = 35


set @cmd = 'SELECT top 1 * FROM T1 where 1=1 '
+ case when @parameter2 is not null then ' and id = '+cast(@parameter2 AS varchar(10))
else '' end 

exec (@cmd)
26 янв 15, 12:36    [17170022]     Ответить | Цитировать Сообщить модератору
 Re: Пожалуйста помогите с оптимизацией условия в запросе  [new]
тестир
Guest
Всем большое спасибо!

Дальше я попробую сам :)
26 янв 15, 13:03    [17170279]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить