|
|
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
Имеется БД Oracle 9i и количество непоследовательных id около 10000. Необходимо выполнить Select * from TBL where id in (1000, 2103, 7320, ... 21248); Вносить изменения в БД запрещено разработчиком, можно только select. Таким образом создавать таблицы с перечнем id нельзя. Временные таблицы, насколько я понял из статьи http://www.sql.ru/blogs/oracleandsql/1373 вносят изменения: "После создания временной таблицы ее описание сохраняется в словаре данных ORACLE...". 1. Правильно ли я понимаю, что единственный выход -select id in (....., n)? 2. И тогда, какое ограничение на перечень? Где-то на форуме нашел ограничение в 1000. Так ли? 3. Слабое железо на сервере и мало памяти. Какое оптимальное количество в перечне, что бы не повесить сервер вообще и оставить небольшой запас ресурсов для других задач, хотя бы что бы сервер отвечал? Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 16:52 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
nnn2k, Сформулируйте, пожалуйста, конкретнее, что вам надо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 17:00 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
nnn2k, Код: plsql 1. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 17:02 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
nnn2k, создай отдельную схему, создай там табилцу залей туда данные и дай грант нужной схеме на селект. и не делай мозги себе и людям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 17:02 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
nnn2k, ну сделайте подзапрос, ваши id-ки попадают же под выборку и какие-нибудь условия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 17:04 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
nnn2kИмеется БД Oracle 9i и количество непоследовательных id около 10000. Необходимо выполнить Select * from TBL where id in (1000, 2103, 7320, ... 21248); .. 1. Правильно ли я понимаю, что единственный выход -select id in (....., n)? .. Спасибо! как раз неправильно воткнётесь в лимит 1000 и тема обсуждалась не единожды. ищите ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 19:44 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
nnn2k1. Правильно ли я понимаю, что единственный выход -select id in (....., n)? Спасибо! select * from t where (id,1) in ((1000,1), (2103,1), (7320,1), ... (21248,1)); пар (a,b) можно больше 1000 ...... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 20:28 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
Anton_Deminnnn2k, Сформулируйте, пожалуйста, конкретнее, что вам надо? Еженедельно присылается xml файл где содержится ~10000 разных id, по этим id надо делать выборку из БД Oracle, в которую нельзя вносить изменения - нельзя вмешиваться в структуру БД, нельзя создавать дополнительные таблицы типа "table_of_numbers". Написав запрос Select * from TBL where id in (..... 10000) он получится огромного размера и Oracle его просто не пропустит по лимиту. Создавать 10000 выборок (select * from TBL where id=1; select * from TBL where id=15; ...) - столько запросов будет выполнятся слишком долго и, наверное, подвесит сервер. --Eugene--, Для создания коллекции table_of_numbers придется вносить изменения в схему, чего нельзя делать по условиям. trace.log, id лежат отдельно в xml файле. orawish, Можно распределить 10'000 id по 10 запросам по 1'000 id. Всяко быстрее чем 10'000 отдельных запросов по одному id. Много тем на эту тему, но из всего что нашел - чаще предложения о временных таблицах, что, предположительно, вносит изменения в схему и запрещено разработчиком БД. stax.., Справится ли слабый сервер с таким запросом или повиснет на час? В ближайшее время не могу его так протестировать. Может у Вас был опыт по времени исполнения подобного запроса. Vint, Вероятно это самый простой и безболезненный способ, им и воспользуюсь. Спасибо за мысль! Спасибо всем за ответы! Использую вариант Vint'а, так как остальные возможности не подходят по условиям использования БД без изменений или вопрос с нагрузкой на БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2017, 11:50 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
nnn2kxml файл где содержится ~10000 разных id, по этим id надо делать выборку из БД Oracle, в которую нельзя вносить изменения Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2017, 12:11 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
Извиняюсь, совсем запутался в структуре Oracle, не часто с ним работаю. Доп. условия: есть пользователь USER_BUH, в нем набор данных, который надо получить (select * from TBL), имея много id из xml файла. Получается, что и схему в пользователе я не могу новую создать, так как запрет распространяется на всего пользователя. Создавать нового пользователя (USER_TMP_TBL) только ради таблицы с id номерами - не рационально, полагаю. Да и разрешения надо же сохранять внутри основного пользователя USER_BUH, в которого логинится программа оператора (сотрудника), что опять запрещено. Вероятно придется вернуться к разбивке диапазона id по нескольким выборкам (~10000 по 10-20 выборкам select). Хотя, поразмыслив, описание временных таблиц же сохраняются в словарь Oracle, который является системным, а не пользовательским, вроде как. Остается надеяться, что это так, и разработчик БД не завернет запрос с использованием временных таблиц. Elic, Спасибо, это был бы замечательный вариант. Но насколько понял: xmltable ввели только в 10й версии, а у меня на производстве 9i. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2017, 12:36 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
nnn2kа у меня на производстве 9i.rtfm xmlsequence ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2017, 12:38 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
[quot nnn2k]Anton_Deminnnn2k, stax.., Справится ли слабый сервер с таким запросом или повиснет на час? В ближайшее время не могу его так протестировать. Может у Вас был опыт по времени исполнения подобного запроса. опыта на 10000 нет попробуйте, минутное ж дело ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 00:13 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
Я сразу хочу извиниться перед уважаемым сообществом за не-Oracle. И так, у вас есть база с которой нет возможности нормально работать и если вы не можете вносить в базу изменения, то и результаты вашей выборки и сравнения с XML остаются вне базы данных. И если это так, спрашивается - а зачем вам в таком случае делать сравнение при помощи SQL? (select .... where ... in) Например Python лугко обработает 10000 ваших id и с XML умеет работать. (других средств тоже полно) (по питону см. : xml.etree.ElementTree и cx_Oracle) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2017, 10:17 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
nnn2k, во первых совет элика, во вторых, если уж совсем руки не из Ж. видимо массив из клиента в оракл это слишком сложно..... и предвосхишая стоны насчет того, что что-то там нельзя сделать в схеме.... создать другую схему в которой можно и дать права никто не запрещает так же как и пользоваться sys.odcinumberlist, правда не помню уже были ли эти типы в 9ке. насчет отдельной схемы совет еще в силе... дай права основной схеме и работай с объектами другой.. это тоже возможно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2017, 10:25 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
stax..nnn2k1. Правильно ли я понимаю, что единственный выход -select id in (....., n)? Спасибо! select * from t where (id,1) in ((1000,1), (2103,1), (7320,1), ... (21248,1)); пар (a,b) можно больше 1000 ...... stax а еще можно alter session set "_fix_control"='17376322:OFF'; тогда и без пар пойдет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2017, 11:36 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
Vintnnn2k, во первых совет элика, во вторых, если уж совсем руки не из Ж. видимо массив из клиента в оракл это слишком сложно..... и предвосхишая стоны насчет того, что что-то там нельзя сделать в схеме.... создать другую схему в которой можно и дать права никто не запрещает так же как и пользоваться sys.odcinumberlist, правда не помню уже были ли эти типы в 9ке. насчет отдельной схемы совет еще в силе... дай права основной схеме и работай с объектами другой.. это тоже возможно... sys.odcinumberlist можно 10000 елементов? Код: plsql 1. 2. 3. 4. 5. ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2017, 18:12 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
stax..sys.odcinumberlist можно 10000 елементов?Можно даже 10001. Но конструктор поддерживает только до 1000 параметров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2017, 19:55 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
-2-stax..sys.odcinumberlist можно 10000 елементов?Можно даже 10001. Но конструктор поддерживает только до 1000 параметров. Код: plsql 1. 2. так я о "конструкторе", или есть другой способ, я о задачке nnn2k? ps 10000 пар без проблем хавает слабенький сервер ...... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2017, 20:09 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
Не увидел вариант попробовать вариант с with: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 09:07 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
stax.., если говорить о вызове из java например то посмотрев пример Дениса Попова за 5 год можно увидеть что он вызывает процедуру. без конструктора. смысл конкатенировать? я вызывал как select * from table((?) as odci.numberlist). не помню уже сколько я там закидывал элементов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 11:02 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
Vintstax.., если говорить о вызове из java например то посмотрев пример Дениса Попова за 5 год можно увидеть что он вызывает процедуру. без конструктора. смысл конкатенировать? я вызывал как select * from table((?) as odci.numberlist). не помню уже сколько я там закидывал элементов. так я об етом и талдычу что (?) на 10000 не прокатит ...... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 15:58 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
stax.., так я ж вначале написал что отдельная схема с правами на основную всё решает... ну а odci вспомнил как костыль.))) ну не прокатит и ладно)) я не расстроюсь)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 16:02 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
Vintstax.., так я ж вначале написал что отдельная схема с правами на основную всё решает... ну а odci вспомнил как костыль.))) ну не прокатит и ладно)) я не расстроюсь)) да я не против отдельной схемы, но нужны права иногда встречаются параноики админы/безпечники которых не переубедить ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 16:50 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
Если SQL будет создаваться динамически то я не вижу проблем для решения 1 запросом: Или как предложил Stax stax..select * from t where (id,1) in ((1000,1), (2103,1), (7320,1), ... (21248,1)); пар (a,b) можно больше 1000 или Код: plsql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 11:12 |
|
||
|
Select id in (1, 2, 3 ... n)
|
|||
|---|---|---|---|
|
#18+
Извиняюсь, ушел в работу с головой. Сначала маялся с установкой тестового сервера 9i на Linux, в итоге - виртуалка и Win, для экспериментов над вариантами решения вопроса. По сути: На рабочем сервере разбил 100к запросов по 10000 - 0.2-0.6 секунд на каждые 10к. Вполне приемлемо. То что предложил Elic (xmlsequence) - тоже успешно заработало на 9i, но пришел к предположению, что парсинг xml - это опять же лишняя нагрузка на оперативку (если конечно происходит разбивка на DOM элементы), так что plain text - вероятно дешевле. Остановился на Where id in (....) с разбивкой по 10к запросов. Спасибо всем за помощь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2017, 21:04 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39417097&tid=1886162]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
191ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 497ms |

| 0 / 0 |
