Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

оптимизация sql-запросов с IN


Camaro ©   (2013-02-08 11:07:00) 

Есть программа для работы с договорами. В ней реализован поиск договоров. ID найденных договоров сохраняются в список, чтобы в дальнейшем можно было выполнить какие-либо действия над найденными договорами. Например, нужно установить найденным договорам статус - расторгнут, это список передается диалоговому окну изменения статуса, где ID из списка подставляются в SQL запрос, который меняет статус - ... WHERE ID IN %s .... Таких ID может быть хоть миллион. Запрос получается такой UPDATE item SET ... WHERE ID IN (1, 2, 3, 4, 5, 6, 7, 8, 9, ... 1000000) ...Хорошо ли делать такой IN?


Amoeba_   (2013-02-10 03:25:00) [1]


> Запрос получается такой UPDATE item SET ... WHERE ID IN
> (1, 2, 3, 4, 5, 6, 7, 8, 9, ... 1000000)

Жесть!


Inovet   (2013-02-09 13:54:00) [2]

> [11] Михаил   (09.02.13 11:55)

Чем 100 лучше 200, или 1, или все?


Михаил   (2013-02-09 11:55:00) [3]

Парси список по 100 ID-шников и передавай по очереди.


знайка   (2013-02-08 15:03:00) [4]

про субд ни слова...


Inovet   (2013-02-08 14:26:00) [5]

> [8] Camaro   (08.02.13 14:24)
> Их нужно грамотно подставить в запрос

Тогда параметром и в цикле вызывать INSERT. Prepare не забудь до цикла вызвать.


Camaro   (2013-02-08 14:24:00) [6]


> Ega23 ©


Программа в трехзвенке. Все операции с БД выполняюся на сервере приложений. Клиент по сокетам отдает данные серверу, в моем случае это id найденных договоров. Их нужно грамотно подставить в запрос.


Ega23   (2013-02-08 14:16:00) [7]


> чет, не пойму, как в темповую таблицу единоразово вставить
> все id из списка

Зачем из списка-то?

> Есть программа для работы с договорами. В ней реализован
> поиск договоров. ID найденных договоров сохраняются в список

Это на клиенте или на сервере происходит?


Inovet   (2013-02-08 14:15:00) [8]

> [5] Camaro   (08.02.13 14:12)
> вставить все id из списка

INSERT INTO TMP SELECT ID FROM TBL


Camaro   (2013-02-08 14:12:00) [9]


> Заведи временную таблицу, вставь в неё эти ID и передавай
> имя таблицы.


чет, не пойму, как в темповую таблицу единоразово вставить все id из списка


Camaro   (2013-02-08 12:08:00) [10]


> Заведи временную таблицу, вставь в неё эти ID и передавай
> имя таблицы.


Спасибо, так и сделаю.


Anatoly Podgoretsky   (2013-02-08 11:44:00) [11]


> Хорошо ли делать такой IN?

Плохо


O'ShinW   (2013-02-08 11:36:00) [12]

Аналогично было
> что больше полутора тысяч значений в IN не влезало

и на MSSQL, и на Oracle
при генерации запросов


Ega23   (2013-02-08 11:22:00) [13]

Внезапно наткнулся в FireBird, что больше полутора тысяч значений в IN не влезало, ошибка gds32.
Заведи временную таблицу, вставь в неё эти ID и передавай имя таблицы.


Наверх

Титульная страница Поиск, карта сайта Написать письмо