SQL Server хранимка
От: Ellin Россия www.rsdn.ru
Дата: 14.07.09 10:16
Оценка:
Нужно написать хранимку, которая выбирает данные селектом с идентификатором равным входному параметру. Если идентификатор равен 0, то нужно возвращать все записи. Как в таких случаях писать. Мне почему то подход в стиле:

IF (@Type IS NOT NULL)
BEGIN
SELECT 
DefProcID,
...
WHERE 
...           
AND TCLS.ClsTypeID = @Type

END

ELSE
BEGIN
SELECT 
DefProcID,
...
WHERE ...
END

Не очень нравится. Есть другие пути решения?
Re: SQL Server хранимка
От: dimok@  
Дата: 14.07.09 10:30
Оценка: 9 (2) +1
select ... from ... @id=0 or id=@id
Re[2]: SQL Server хранимка
От: Ellin Россия www.rsdn.ru
Дата: 14.07.09 10:40
Оценка:
Здравствуйте, dimok@, Вы писали:

D>
D>select ... from ... @id=0 or id=@id
D>


Мда... а я тут горожу
WHERE 
    (CASE WHEN @Id <> 0 THEN pc.Id ELSE 1 END)=
    (CASE WHEN @Id <> 0 THEN @Id ELSE 1 END)


Re: SQL Server хранимка
От: MasterZiv СССР  
Дата: 14.07.09 20:48
Оценка: 2 (1) +1
Ellin пишет:

> идентификатором равным входному параметру. Если идентификатор равен 0,

> то нужно возвращать все записи. Как в таких случаях писать. Мне почему
> то подход в стиле:

> Не очень нравится. Есть другие пути решения?


А зря он тебе не нравится. Наоборот, это -- хороший
подход. Потому что писать сложные условия в одном
запросе -- только путать оптимизатор. Делают
даже ещё "кривее" с твоей точки зрения -- пишут
эти два запроса в разных процедурах, которые
возможно вызываются по аналогичному условию(ям) из одной главной,
зовущейся с клиента.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: SQL Server хранимка
От: Ellin Россия www.rsdn.ru
Дата: 15.07.09 07:42
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>А зря он тебе не нравится. Наоборот, это -- хороший

MZ>подход. Потому что писать сложные условия в одном
MZ>запросе -- только путать оптимизатор. Делают
MZ>даже ещё "кривее" с твоей точки зрения -- пишут
MZ>эти два запроса в разных процедурах, которые
MZ>возможно вызываются по аналогичному условию(ям) из одной главной,
MZ>зовущейся с клиента.
Вот как раз разбить на хранимки мне, почемуто не кажется самым кривым способом...
Вобщем получается вариант с разбиением на хранимки наиболее оптимальный по производительности?
Далее идет вариант с if в одной хранимке
Далее вариант с or в условии
Так получается?
А как насчет варианта с CASE?
WHERE 
    (CASE WHEN @Id <> 0 THEN pc.Id ELSE 1 END)=
    (CASE WHEN @Id <> 0 THEN @Id ELSE 1 END)

Оцените его плз... Как по производительности? Насколько так принято писать?
Re[2]: SQL Server хранимка
От: sunshine Россия https://angel.ru/?src=rsdn
Дата: 15.07.09 08:09
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>даже ещё "кривее" с твоей точки зрения -- пишут

MZ>эти два запроса в разных процедурах, которые
MZ>возможно вызываются по аналогичному условию(ям) из одной главной,
MZ>зовущейся с клиента.

Ну уж я не знаю, как сильно должно прижать с производительностью, чтобы на разные хранимки это разбивать, с вытекающим отсюда дублированием кода (если я правильно понял Вашу мысль)...
Принимаю платежи в любой валюте
Re[3]: SQL Server хранимка
От: MasterZiv СССР  
Дата: 15.07.09 08:42
Оценка: 2 (1)
Ellin пишет:

> Вобщем получается вариант с разбиением на хранимки наиболее оптимальный

> по производительности?

Потенциально -- да, но там куча нюансов, связанных с кэшированием
планов процедур и работой приложения. Иногда разбивать на несколько
процедур просто нецелесообразно, потому что лучших планов всё равно
не добъёшься, а иногда -- просто необходимо.
К тому же нужно ещё знать современный MSSQL (это нюансы по кэшированию
планов), а я его знаю плохо.

> Далее идет вариант с if в одной хранимке

> Далее вариант с or в условии

Вариант с OR в условии -- вообще никакой, поэтому
его лучше не использовать и не рассматривать,
если таблица хоть сколько-нибудь велика и
запрос нужен быстрым.

> WHERE

> (CASE WHEN @Id <> 0 THEN pc.Id ELSE 1 END)=
> (CASE WHEN @Id <> 0 THEN @Id ELSE 1 END)

А это всё равно , с CASE или c OR. C CASE даже наверное
ещё и хуже.

> Оцените его плз... Как по производительности? Насколько так принято писать?


Производительность -то не оценить, но потенциально ты таким образом
отсекаешь у оптимизатора возможность сделать хороший план запроса.
А дальше -- от запроса зависит. Если хороший план запроса этому
запросу вообще нужен (есть такие запросы, которым не нужнен), то потенциально
производительность с такими WHERE, где такие OR-ы (именно такие, а не
произвольные OR-ы), где выражения с использованием колонок, а не прямое
сравнение их со значниями, будет ниже.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: SQL Server хранимка
От: MasterZiv СССР  
Дата: 15.07.09 09:15
Оценка: 1 (1)
sunshine пишет:
> Ну уж я не знаю, как сильно должно прижать с производительностью, чтобы
> на разные хранимки это разбивать, с вытекающим отсюда дублированием кода
> (если я правильно понял Вашу мысль)...

Правильно, правильно. Главное, что нужно понять, что при программировании
на SQL такие вещи, как повторное использование кода, читаемость кода и
вообще многое из того, что принято считать хорошим тоном при программировании
на обычных императивных языках программирования общего назначения, не
являются главными. Они хороши, только если не мешают главному -- достижению
высокой производительности запросов.
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.