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

Откуда:
Сообщений: 381
Как на сиквеле правильно (принято) писать процедуры для разных условий выборки.

Например если в таблице несколько ключевых полей. Скажем так - праймари ки и несколько форейн ки. Есть потребность выбирать один и тот же набор полей для каждого из этих ключей. Я пишу что то вроде

CREATE PROCEDURE GetJobService
	@ID bigint,
	@JobID bigint
AS
SET NOCOUNT ON

SELECT * FROM JobService 
WHERE (@ID IS NULL OR @ID = ID) AND 
      (@JobID IS NULL OR Job = @JobID)


Получаю полный скан по таблице (Estimated row count = длине таблицы).

не хотелось бы создавать две процедуры для этого или использовать IF (если добавить поле в выборку придется менять все процедуры а их может быть больше двух)...
5 окт 04, 13:27    [1009257]     Ответить | Цитировать Сообщить модератору
 Re: Процедура для разных выборок  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Полуэкт
Как на сиквеле правильно (принято) писать процедуры для разных условий выборки.
Постараться избегать использование звездочки.
Полуэкт
Получаю полный скан по таблице (Estimated row count = длине таблицы).

не хотелось бы создавать две процедуры для этого или использовать IF (если добавить поле в выборку придется менять все процедуры а их может быть больше двух)...
Дык, всё-таки шашечки или ехать? Почему не написать несколько коротких и высокоизбирательных запросов? Что мешает иметь хоть 10 таких процедур, если они обеспечат максимальную производительность?
5 окт 04, 13:36    [1009314]     Ответить | Цитировать Сообщить модератору
 Re: Процедура для разных выборок  [new]
Полуэкт
Member

Откуда:
Сообщений: 381
звездочка для примера.

потому - что если изменить набор полей то придется переделывать все 10 процедур. если нет других решений то так и придется делать конечно.
5 окт 04, 19:50    [1010817]     Ответить | Цитировать Сообщить модератору
 Re: Процедура для разных выборок  [new]
Амимопроходил
Guest
м.б. просто так))

CREATE PROCEDURE GetJobService
	@ID bigint,
	@JobID bigint
AS
SET NOCOUNT ON
IF @ID IS NOT NULL 
    IF @JobID IS NOT NULL
           SELECT * FROM JobService  WHERE @ID = ID AND @JobID = ID
     ELSE SELECT * FROM JobService WHERE @ID = ID
ELSE
  IF @JobID IS NOT NULL
           SELECT * FROM JobService  WHERE @JobID = ID
     ELSE SELECT * FROM JobService
6 окт 04, 07:34    [1011157]     Ответить | Цитировать Сообщить модератору
 Re: Процедура для разных выборок  [new]
mart
Member

Откуда:
Сообщений: 33
Так должен использоваться индекс
CREATE PROCEDURE GetJobService
	@ID bigint,
	@JobID bigint
AS
SET NOCOUNT ON
declare
	@MinBigint bigint,
	@MaxBigint bigint
SELECT
	@MinBigint = -9223372036854775808,
	@MaxBigint = 9223372036854775807

SELECT * FROM JobService 
WHERE
	ID between isnull(@ID, @MinBigint) and isnull(@ID, @MaxBigint) and
	Job between isnull(@JobID, @MinBigint) and isnull(@JobID, @MaxBigint)
6 окт 04, 08:45    [1011209]     Ответить | Цитировать Сообщить модератору
 Re: Процедура для разных выборок  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
CREATE PROCEDURE GetJobService
	@ID bigint,
	@JobID bigint
AS
SET NOCOUNT ON

SELECT * FROM JobService 
WHERE ID=IsNull(@ID,ID) AND JobID=isNull(@JobID,JobID)
6 окт 04, 09:22    [1011269]     Ответить | Цитировать Сообщить модератору
 Re: Процедура для разных выборок  [new]
Полуэкт
Member

Откуда:
Сообщений: 381
Вот это я и спрашивал :)

Спасибо!
6 окт 04, 15:30    [1013243]     Ответить | Цитировать Сообщить модератору
 Re: Процедура для разных выборок  [new]
Trong
Member

Откуда: Novosibirsk
Сообщений: 759
А фиолетово, что так скан, что так.

Только, что в вариации
SELECT * FROM JobService 
WHERE ID=IsNull(@ID,ID) AND JobID=isNull(@JobID,JobID)
букмарков не будет скорее всего
6 окт 04, 15:48    [1013333]     Ответить | Цитировать Сообщить модератору
 Re: Процедура для разных выборок  [new]
Полуэкт
Member

Откуда:
Сообщений: 381
может кому фиолетово а у меня теперь estimated row count 2000 вместо 120000 как раньше.
6 окт 04, 16:44    [1013658]     Ответить | Цитировать Сообщить модератору
 Re: Процедура для разных выборок  [new]
guest00x
Guest
1. select * from sometable where some_id=@xid or @xid is null
2. select * from sometable where some_id=isnull(@xid,some_id)
В общем батче, на разных таблицах, соотношение стоимости ~ 16-34%% к 84-66%%, т.е. вторая конструкция хуже, если верить плану выполнения :-)
6 окт 04, 17:00    [1013759]     Ответить | Цитировать Сообщить модератору
 Re: Процедура для разных выборок  [new]
Полуэкт
Member

Откуда:
Сообщений: 381
Не перевелись еще пытливые умы :) Однако вопрос был не про это...
6 окт 04, 19:19    [1014215]     Ответить | Цитировать Сообщить модератору
 Re: Процедура для разных выборок  [new]
Trong
Member

Откуда: Novosibirsk
Сообщений: 759
Полуэкт
может кому фиолетово а у меня теперь estimated row count 2000 вместо 120000 как раньше.

И статистика актуальна?
Сейчас проверил на моих таблицах - получается скан в обоих случаях, что впрочем объяснимо.
7 окт 04, 06:12    [1014529]     Ответить | Цитировать Сообщить модератору
 Re: Процедура для разных выборок  [new]
Полуэкт
Member

Откуда:
Сообщений: 381
актуальна. может у тебя индекс где потерян?
7 окт 04, 12:44    [1015649]     Ответить | Цитировать Сообщить модератору
 Re: Процедура для разных выборок  [new]
Trong
Member

Откуда: Novosibirsk
Сообщений: 759
Полуэкт
актуальна. может у тебя индекс где потерян?

Может конечно, но сомнительно. Да еще на всех таблицах. Вплоть до первичных ключей.
7 окт 04, 12:59    [1015730]     Ответить | Цитировать Сообщить модератору
 Re: Процедура для разных выборок  [new]
Полуэкт
Member

Откуда:
Сообщений: 381
прислать тебе мои скриншоты?
7 окт 04, 15:41    [1016375]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить