Параметризированные запросы с переменным числом аргументов
От: Митрошин Александр Россия  
Дата: 21.01.03 09:33
Оценка:
у меня запрос есть, типа select * from Table where Par1=1 and Par2 IN (1,2,3,....) Можно ли как-нибудь сделать параметризированный запрос, если число параметров в IN может быть любым?
Re: Параметризированные запросы с переменным числом аргумент
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.01.03 09:58
Оценка:
Здравствуйте, Митрошин Александр, Вы писали:

МА>у меня запрос есть, типа select * from Table where Par1=1 and Par2 IN (1,2,3,....) Можно ли как-нибудь сделать параметризированный запрос, если число параметров в IN может быть любым?

увы, нет. Придется "собирать" запрос руками, т.е. вместо биндинга параметров конструировать строку.
Это можно сделать и на сервере, если он поддерживает динамическое исполнение.
Например, в MS SQL можно сделать процедуру, которая принимает в качестве одного из параметров строку разделенных запятыми констант. Внутри эта процедура строит тот самый селект и при помощи execute выполняет его.
Разницы, в общем-то, никакой — все равно запрос придется компилировать каждый раз. Известные мне сервера не умеют кэшировать планы для запросов такого типа.
... << RSDN@Home 1.0 beta 3 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Параметризированные запросы с переменным числом аргум
От: Митрошин Александр Россия  
Дата: 21.01.03 10:15
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Митрошин Александр, Вы писали:


S>увы, нет. Придется "собирать" запрос руками, т.е. вместо биндинга параметров конструировать строку.


Печально, печально...дело в том, что параметров может быть тысяча и две тысячи — тормозить же будет . А если таблицу подсовывать?Может, будет быстрее?
Re[3]: Параметризированные запросы с переменным числом аргум
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.01.03 10:30
Оценка: 14 (1)
Здравствуйте, Митрошин Александр, Вы писали:

МА>Печально, печально...дело в том, что параметров может быть тысяча и две тысячи — тормозить же будет . А если таблицу подсовывать?Может, будет быстрее?

Гм. основные тормоза (скорее всего) будут при передаче запроса в сервер.
Да, для способа с использованием прямого перечисления в in () есть ограничение (MS SQL например ограничивает размер бвтча в 64к). Две тысячи целых констант гарантированно в него влезут...
Способ с использованием таблички гарантирует единообразную обработку списков любой длины. Но! Если в качестве параметров используются целые числа, то первый способ съест не более 11 байт на элемент, в то время как при втором придется N раз передать на сервер
insert into #t(a) values (xxxx);

или (если заранее подготовится)
exec add_param xxxx

Это существенно увеличит суммарный трафик и может негативно сказаться на производительности при наличии транзакций.
... << RSDN@Home 1.0 beta 5 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Параметризированные запросы с переменным числом аргум
От: Митрошин Александр Россия  
Дата: 21.01.03 10:48
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Митрошин Александр, Вы писали:


S>Способ с использованием таблички гарантирует единообразную обработку списков любой длины. Но! Если в качестве параметров используются целые числа, то первый способ съест не более 11 байт на элемент, в то время как при втором придется N раз передать на сервер

S>
S>insert into #t(a) values (xxxx);
S>

S>или (если заранее подготовится)
S>
S>exec add_param xxxx
S>

S>Это существенно увеличит суммарный трафик и может негативно сказаться на производительности при наличии транзакций.

А если сделать вторую таблицу, где перечислять все возможные параметры и их ID? А потом передавать только нужный ID, вытаскивать номера и передавать результат запроса в качестве параметра первому запросу.

select * from Table where Par1=1 and Par2 IN (select Par2 from table2 where ID=?)



Так быстрее будет?
Re[3]: Параметризированные запросы с переменным числом аргум
От: Sergey Ten http://www.fastalgo.com
Дата: 21.01.03 10:52
Оценка:
Здравствуйте, Митрошин Александр, Вы писали:

МА>дело в том, что параметров может быть тысяча и две тысячи


А сервер какой? В Oracle (насчет 9i не знаю, но в 8.0 — точно) ограничение на число элементов в in() — 1000. Так что придется еще и union к этой конструкции соорудить. Может, действительно, во временную таблицу подготавливать, а потом — inner join? Тогда в том же Oracle можно воспользоваться array insert-ами и существенно сэкономить на сетевом трафике.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.