|
|
|
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
|
|||
|---|---|---|---|
|
#18+
Господа, поделитесь опытом как лучше быть. Такая процедура: 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) приводят к сканированию таблицы (по крайней мере так планы процедур показывают). Заранее большое спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2008, 20:00 |
|
||
|
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
|
|||
|---|---|---|---|
|
#18+
Неужели никому не приходится иметь дело с процедурами в которых запрос использует параметры в качестве SARG? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2008, 16:06 |
|
||
|
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
|
|||
|---|---|---|---|
|
#18+
Да приходится, то приходится.... Просто универсального ответа на этот вопрос лично мне не известно. Если мне нужно сделать что-то подобное, то я обычно просто иду по пути ' where (@p1 is null or field1 = @p1) ', но в основном я пытаюсь изменить логику работы чтобы вообще избавится от or в условиях. --- http://www.rusug.ru] Портал русскоязычной группы пользователей Sybase ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2008, 18:50 |
|
||
|
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
|
|||
|---|---|---|---|
|
#18+
White OwlДа приходится, то приходится.... Просто универсального ответа на этот вопрос лично мне не известно. Если мне нужно сделать что-то подобное, то я обычно просто иду по пути ' where (@p1 is null or field1 = @p1) ', но в основном я пытаюсь изменить логику работы чтобы вообще избавится от or в условиях. --- http://www.rusug.ru] Портал русскоязычной группы пользователей Sybase Спасибо за ответ. Мне тоже нравится where (@p1 is null or field1 = @p1) Почему-то кажется в этом случае когда параметр не нулевой индекс должен использоваться. Но план запроса упорно показывает скан таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2008, 22:35 |
|
||
|
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
|
|||
|---|---|---|---|
|
#18+
можно пользовать execute(@query) ну и @query заранее сформировать без OR ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2008, 14:03 |
|
||
|
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
|
|||
|---|---|---|---|
|
#18+
Dmitry.можно пользовать execute(@query) ну и @query заранее сформировать без OR В этом случае упадёт производительность т.к. при каждом выполнении план будет строиться заново. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2008, 17:01 |
|
||
|
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
|
|||
|---|---|---|---|
|
#18+
KruВ этом случае упадёт производительность т.к. при каждом выполнении план будет строиться заново.Время потраченное на построение плана это ничто по сравнению с выигрышем если оптимизатор воспользуется индексом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2008, 17:29 |
|
||
|
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
|
|||
|---|---|---|---|
|
#18+
White Owl KruВ этом случае упадёт производительность т.к. при каждом выполнении план будет строиться заново.Время потраченное на построение плана это ничто по сравнению с выигрышем если оптимизатор воспользуется индексом. Полностью согласен, но всё-таки не хочется строить запросы динамически. Трудно подобные процедуры потом поддерживать. Да и не везеде они в корпоративный стандарт вписываются. Наверное придётся исходить из ситуации - смотреть где индекс действительно нужен, там параметры Ifом проверять, ну а по остальным можно и условие типа ((@param is null) or (field = @param)). Всё-таки старнно, что при таком условии происходит скан. Ведь всего-то требуется ключи индекса сравнить с параметром, если он есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2008, 22:37 |
|
||
|
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
|
|||
|---|---|---|---|
|
#18+
Кажется, что Сайбезовский оптимизатор всё ещй очень легко сбить с толку. Такой простой пример: select * from tst where ((100 is null) or id = 100) приводит к сканированию таблицы. Ради интереса попробовал тоже самое на DB2. Там оптимизатор выбирает индекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2008, 23:20 |
|
||
|
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
|
|||
|---|---|---|---|
|
#18+
KruКажется, что Сайбезовский оптимизатор всё ещй очень легко сбить с толку. Такой простой пример: select * from tst where ((100 is null) or id = 100) приводит к сканированию таблицы. Ради интереса попробовал тоже самое на DB2. Там оптимизатор выбирает индекс.На SA10 - тоже индекс подхватывается :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2008, 23:32 |
|
||
|
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
|
|||
|---|---|---|---|
|
#18+
White Owl пишет: > Просто универсального ответа на этот вопрос лично мне не известно. Если Да, универсально применимого ответа нет. Например, если условие полезно для оптимизатора, то лучше делать IF-ы, а сам запрос выносить в вспомогательную процедуру. Но и то не всегда. А если для оптимизатора условие безполезно, то можно хоть в теле запроса все условия писать. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2008, 13:25 |
|
||
|
ASE 12.5 как лучше обрабатывать параметры = null в процедуре
|
|||
|---|---|---|---|
|
#18+
White Owl пишет: > Время потраченное на построение плана это ничто по сравнению с выигрышем > если оптимизатор воспользуется индексом. Это тоже зависит. Время перестроения плана тратится всегда, а выинрыш в скорости от более хорошего плана - только при смене способа выборки. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2008, 13:27 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=35045144&tid=2011743]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
157ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 495ms |

| 0 / 0 |
