powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASE 12.5 как лучше обрабатывать параметры = null в процедуре
12 сообщений из 12, страница 1 из 1
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
    #35044462
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, поделитесь опытом как лучше быть.

Такая процедура:
create procedure dbo.test
@p1 int= null
as
if @p1 is null
begin
select * from table
return
end

select * from table where field1 = @p1
go

Здесь всё понятно и индексы нормально работают (если параметр не нулевой), но что делать если параметров много. Использовать IFы для каждой комбинации крайне затруднительно, а "фокусы" типа
select * from table where field1 = isnull(@p1, field1) или
select * from table where (@p1 is null or field1 = @p1)
приводят к сканированию таблицы (по крайней мере так планы процедур показывают).

Заранее большое спасибо
...
Рейтинг: 0 / 0
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
    #35045144
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неужели никому не приходится иметь дело с процедурами в которых запрос использует параметры в качестве SARG?
...
Рейтинг: 0 / 0
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
    #35045314
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да приходится, то приходится....
Просто универсального ответа на этот вопрос лично мне не известно. Если мне нужно сделать что-то подобное, то я обычно просто иду по пути ' where (@p1 is null or field1 = @p1) ', но в основном я пытаюсь изменить логику работы чтобы вообще избавится от or в условиях.

---
http://www.rusug.ru] Портал русскоязычной группы пользователей Sybase
...
Рейтинг: 0 / 0
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
    #35045456
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlДа приходится, то приходится....
Просто универсального ответа на этот вопрос лично мне не известно. Если мне нужно сделать что-то подобное, то я обычно просто иду по пути ' where (@p1 is null or field1 = @p1) ', но в основном я пытаюсь изменить логику работы чтобы вообще избавится от or в условиях.

---
http://www.rusug.ru] Портал русскоязычной группы пользователей Sybase

Спасибо за ответ.
Мне тоже нравится where (@p1 is null or field1 = @p1)
Почему-то кажется в этом случае когда параметр не нулевой индекс должен использоваться. Но план запроса упорно показывает скан таблицы.
...
Рейтинг: 0 / 0
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
    #35047011
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно пользовать execute(@query)
ну и @query заранее сформировать без OR
...
Рейтинг: 0 / 0
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
    #35047236
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry.можно пользовать execute(@query)
ну и @query заранее сформировать без OR

В этом случае упадёт производительность т.к. при каждом выполнении план будет строиться заново.
...
Рейтинг: 0 / 0
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
    #35047258
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KruВ этом случае упадёт производительность т.к. при каждом выполнении план будет строиться заново.Время потраченное на построение плана это ничто по сравнению с выигрышем если оптимизатор воспользуется индексом.
...
Рейтинг: 0 / 0
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
    #35047489
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl KruВ этом случае упадёт производительность т.к. при каждом выполнении план будет строиться заново.Время потраченное на построение плана это ничто по сравнению с выигрышем если оптимизатор воспользуется индексом.
Полностью согласен, но всё-таки не хочется строить запросы динамически. Трудно подобные процедуры потом поддерживать. Да и не везеде они в корпоративный стандарт вписываются.

Наверное придётся исходить из ситуации - смотреть где индекс действительно нужен, там параметры Ifом проверять, ну а по остальным можно и условие типа ((@param is null) or (field = @param)).

Всё-таки старнно, что при таком условии происходит скан. Ведь всего-то требуется ключи индекса сравнить с параметром, если он есть.
...
Рейтинг: 0 / 0
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
    #35047534
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется, что Сайбезовский оптимизатор всё ещй очень легко сбить с толку.
Такой простой пример:
select * from tst where ((100 is null) or id = 100)
приводит к сканированию таблицы.

Ради интереса попробовал тоже самое на DB2. Там оптимизатор выбирает индекс.
...
Рейтинг: 0 / 0
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
    #35047546
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KruКажется, что Сайбезовский оптимизатор всё ещй очень легко сбить с толку.
Такой простой пример:
select * from tst where ((100 is null) or id = 100)
приводит к сканированию таблицы.

Ради интереса попробовал тоже самое на DB2. Там оптимизатор выбирает индекс.На SA10 - тоже индекс подхватывается :)
...
Рейтинг: 0 / 0
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
    #35049850
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl пишет:
> Просто универсального ответа на этот вопрос лично мне не известно. Если

Да, универсально применимого ответа нет.

Например, если условие полезно для оптимизатора, то лучше
делать IF-ы, а сам запрос выносить в вспомогательную процедуру.
Но и то не всегда. А если для оптимизатора условие безполезно,
то можно хоть в теле запроса все условия писать.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
    #35049858
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl пишет:
> Время потраченное на построение плана это ничто по сравнению с выигрышем
> если оптимизатор воспользуется индексом.

Это тоже зависит.
Время перестроения плана тратится всегда, а выинрыш в скорости от более хорошего
плана - только при смене способа выборки.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASE 12.5 как лучше обрабатывать параметры = null в процедуре
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]