Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Select id in (1, 2, 3 ... n)  [new]
nnn2k
Member

Откуда:
Сообщений: 5
Имеется БД Oracle 9i и количество непоследовательных id около 10000.
Необходимо выполнить Select * from TBL where id in (1000, 2103, 7320, ... 21248);
Вносить изменения в БД запрещено разработчиком, можно только select. Таким образом создавать таблицы с перечнем id нельзя. Временные таблицы, насколько я понял из статьи [url=]https://www.sql.ru/blogs/oracleandsql/1373[/url] вносят изменения: "После создания временной таблицы ее описание сохраняется в словаре данных ORACLE...".
1. Правильно ли я понимаю, что единственный выход -select id in (....., n)?
2. И тогда, какое ограничение на перечень? Где-то на форуме нашел ограничение в 1000. Так ли?
3. Слабое железо на сервере и мало памяти. Какое оптимальное количество в перечне, что бы не повесить сервер вообще и оставить небольшой запас ресурсов для других задач, хотя бы что бы сервер отвечал?
Спасибо!
10 мар 17, 16:52    [20282919]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
Anton_Demin
Member

Откуда: Ставрополь
Сообщений: 294
nnn2k,

Сформулируйте, пожалуйста, конкретнее, что вам надо?
10 мар 17, 17:00    [20282962]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
nnn2k,

select tbl.* from table(table_of_number) n join tbl on tbl.id = n.column_value
?
10 мар 17, 17:02    [20282968]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
nnn2k,
создай отдельную схему, создай там табилцу залей туда данные и дай грант нужной схеме на селект. и не делай мозги себе и людям.
10 мар 17, 17:02    [20282970]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
trace.log
Guest
nnn2k,

ну сделайте подзапрос, ваши id-ки попадают же под выборку и какие-нибудь условия.
10 мар 17, 17:04    [20282980]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
nnn2k
Имеется БД Oracle 9i и количество непоследовательных id около 10000.
Необходимо выполнить Select * from TBL where id in (1000, 2103, 7320, ... 21248);
..
1. Правильно ли я понимаю, что единственный выход -select id in (....., n)?
..
Спасибо!

как раз неправильно
воткнётесь в лимит 1000

и тема обсуждалась не единожды. ищите
10 мар 17, 19:44    [20283486]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
stax..
Guest
nnn2k
1. Правильно ли я понимаю, что единственный выход -select id in (....., n)?
Спасибо!


select * from t where (id,1) in ((1000,1), (2103,1), (7320,1), ... (21248,1));

пар (a,b) можно больше 1000

......
stax
10 мар 17, 20:28    [20283568]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
nnn2k
Member

Откуда:
Сообщений: 5
Anton_Demin
nnn2k,

Сформулируйте, пожалуйста, конкретнее, что вам надо?

Еженедельно присылается 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 мар 17, 11:50    [20284283]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
Elic
Member

Откуда:
Сообщений: 29990
nnn2k
xml файл где содержится ~10000 разных id, по этим id надо делать выборку из БД Oracle, в которую нельзя вносить изменения
... where id in (select ... from xmltable('...' passing xmltype(:clob) columns ...))
11 мар 17, 12:11    [20284315]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
nnn2k
Member

Откуда:
Сообщений: 5
Извиняюсь, совсем запутался в структуре 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 мар 17, 12:36    [20284342]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
Elic
Member

Откуда:
Сообщений: 29990
nnn2k
а у меня на производстве 9i.
rtfm xmlsequence
11 мар 17, 12:38    [20284345]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
stax..
Guest
[quot nnn2k]
Anton_Demin
nnn2k,


stax..,
Справится ли слабый сервер с таким запросом или повиснет на час? В ближайшее время не могу его так протестировать. Может у Вас был опыт по времени исполнения подобного запроса.


опыта на 10000 нет

попробуйте, минутное ж дело

.....
stax
12 мар 17, 00:13    [20285866]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
Kumotori
Member

Откуда:
Сообщений: 31
Я сразу хочу извиниться перед уважаемым сообществом за не-Oracle.

И так, у вас есть база с которой нет возможности нормально работать и если вы не можете вносить в базу изменения, то и результаты вашей выборки и сравнения с XML остаются вне базы данных.
И если это так, спрашивается - а зачем вам в таком случае делать сравнение при помощи SQL? (select .... where ... in)

Например Python лугко обработает 10000 ваших id и с XML умеет работать. (других средств тоже полно)

(по питону см. : xml.etree.ElementTree и cx_Oracle)
13 мар 17, 10:17    [20288342]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
nnn2k,
во первых совет элика, во вторых, если уж совсем руки не из Ж. видимо массив из клиента в оракл это слишком сложно..... и предвосхишая стоны насчет того, что что-то там нельзя сделать в схеме.... создать другую схему в которой можно и дать права никто не запрещает так же как и пользоваться sys.odcinumberlist, правда не помню уже были ли эти типы в 9ке. насчет отдельной схемы совет еще в силе... дай права основной схеме и работай с объектами другой.. это тоже возможно...
13 мар 17, 10:25    [20288373]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
Nobody1111
Guest
stax..
nnn2k
1. Правильно ли я понимаю, что единственный выход -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 мар 17, 11:36    [20288683]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
stax..
Guest
Vint
nnn2k,
во первых совет элика, во вторых, если уж совсем руки не из Ж. видимо массив из клиента в оракл это слишком сложно..... и предвосхишая стоны насчет того, что что-то там нельзя сделать в схеме.... создать другую схему в которой можно и дать права никто не запрещает так же как и пользоваться sys.odcinumberlist, правда не помню уже были ли эти типы в 9ке. насчет отдельной схемы совет еще в силе... дай права основной схеме и работай с объектами другой.. это тоже возможно...


sys.odcinumberlist можно 10000 елементов?


SQL> @D:\t.sql
4,8,12,16,20,24,28,32,36,40,
          *
ERROR at line 5:
ORA-00939: too many arguments for function


.....
stax
13 мар 17, 18:12    [20290874]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
-2-
Member

Откуда:
Сообщений: 15330
stax..
sys.odcinumberlist можно 10000 елементов?
Можно даже 10001. Но конструктор поддерживает только до 1000 параметров.
13 мар 17, 19:55    [20291154]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
stax..
Guest
-2-
stax..
sys.odcinumberlist можно 10000 елементов?
Можно даже 10001. Но конструктор поддерживает только до 1000 параметров.

SQL> desc sys.odcinumberlist
 sys.odcinumberlist VARRAY(32767) OF NUMBER


так я о "конструкторе",
или есть другой способ, я о задачке nnn2k?

ps
10000 пар без проблем хавает слабенький сервер
......
stax
13 мар 17, 20:09    [20291206]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
arlx
Guest
Не увидел вариант попробовать вариант с with:

with tbl as
 (select /*+ MATERIALIZE */
	 *
		from (select 1 id from dual
					 union all
					 select 2 id from dual
					 union all
					 select 3 id from dual
					 union all
					 select 4 id from dual))
select * from mytbl a
/*left*/ join tbl b on a.id = b.id
14 мар 17, 09:07    [20292090]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
stax..,
если говорить о вызове из java например то посмотрев пример Дениса Попова за 5 год можно увидеть что он вызывает процедуру. без конструктора. смысл конкатенировать? я вызывал как select * from table((?) as odci.numberlist). не помню уже сколько я там закидывал элементов.
14 мар 17, 11:02    [20292452]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
stax..
Guest
Vint
stax..,
если говорить о вызове из java например то посмотрев пример Дениса Попова за 5 год можно увидеть что он вызывает процедуру. без конструктора. смысл конкатенировать? я вызывал как select * from table((?) as odci.numberlist). не помню уже сколько я там закидывал элементов.

так я об етом и талдычу что (?) на 10000 не прокатит

......
stax
14 мар 17, 15:58    [20294142]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
stax..,
так я ж вначале написал что отдельная схема с правами на основную всё решает... ну а odci вспомнил как костыль.))) ну не прокатит и ладно)) я не расстроюсь))
14 мар 17, 16:02    [20294170]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
stax..
Guest
Vint
stax..,
так я ж вначале написал что отдельная схема с правами на основную всё решает... ну а odci вспомнил как костыль.))) ну не прокатит и ладно)) я не расстроюсь))

да я не против отдельной схемы, но нужны права

иногда встречаются параноики админы/безпечники которых не переубедить

.....
stax
14 мар 17, 16:50    [20294452]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 652
Если SQL будет создаваться динамически то я не вижу проблем для решения 1 запросом:
Или как предложил Stax
stax..
select * from t where (id,1) in ((1000,1), (2103,1), (7320,1), ... (21248,1));

пар (a,b) можно больше 1000


или

 Select * from TBL where 
     id in (1, 2, 3,..,999)
 or id in (1000, 1001, ...1999)
 or id in (...)     
15 мар 17, 11:12    [20296810]     Ответить | Цитировать Сообщить модератору
 Re: Select id in (1, 2, 3 ... n)  [new]
nnn2k
Member

Откуда:
Сообщений: 5
Извиняюсь, ушел в работу с головой.
Сначала маялся с установкой тестового сервера 9i на Linux, в итоге - виртуалка и Win, для экспериментов над вариантами решения вопроса.
По сути: На рабочем сервере разбил 100к запросов по 10000 - 0.2-0.6 секунд на каждые 10к. Вполне приемлемо.
То что предложил Elic (xmlsequence) - тоже успешно заработало на 9i, но пришел к предположению, что парсинг xml - это опять же лишняя нагрузка на оперативку (если конечно происходит разбивка на DOM элементы), так что plain text - вероятно дешевле. Остановился на Where id in (....) с разбивкой по 10к запросов.
Спасибо всем за помощь!
4 апр 17, 21:04    [20366811]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить