Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Select id in (1, 2, 3 ... n) / 25 сообщений из 26, страница 1 из 2
10.03.2017, 16:52
    #39417088
nnn2k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
Имеется БД 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. Слабое железо на сервере и мало памяти. Какое оптимальное количество в перечне, что бы не повесить сервер вообще и оставить небольшой запас ресурсов для других задач, хотя бы что бы сервер отвечал?
Спасибо!
...
Рейтинг: 0 / 0
10.03.2017, 17:00
    #39417093
Anton_Demin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
nnn2k,

Сформулируйте, пожалуйста, конкретнее, что вам надо?
...
Рейтинг: 0 / 0
10.03.2017, 17:02
    #39417094
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
nnn2k,

Код: plsql
1.
select tbl.* from table(table_of_number) n join tbl on tbl.id = n.column_value

?
...
Рейтинг: 0 / 0
10.03.2017, 17:02
    #39417095
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
nnn2k,
создай отдельную схему, создай там табилцу залей туда данные и дай грант нужной схеме на селект. и не делай мозги себе и людям.
...
Рейтинг: 0 / 0
10.03.2017, 17:04
    #39417097
trace.log
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
nnn2k,

ну сделайте подзапрос, ваши id-ки попадают же под выборку и какие-нибудь условия.
...
Рейтинг: 0 / 0
10.03.2017, 19:44
    #39417206
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
nnn2kИмеется БД Oracle 9i и количество непоследовательных id около 10000.
Необходимо выполнить Select * from TBL where id in (1000, 2103, 7320, ... 21248);
..
1. Правильно ли я понимаю, что единственный выход -select id in (....., n)?
..
Спасибо!
как раз неправильно
воткнётесь в лимит 1000

и тема обсуждалась не единожды. ищите
...
Рейтинг: 0 / 0
10.03.2017, 20:28
    #39417217
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
nnn2k1. Правильно ли я понимаю, что единственный выход -select id in (....., n)?
Спасибо!

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

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

......
stax
...
Рейтинг: 0 / 0
11.03.2017, 11:50
    #39417306
nnn2k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
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'а, так как остальные возможности не подходят по условиям использования БД без изменений или вопрос с нагрузкой на БД.
...
Рейтинг: 0 / 0
11.03.2017, 12:11
    #39417311
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
nnn2kxml файл где содержится ~10000 разных id, по этим id надо делать выборку из БД Oracle, в которую нельзя вносить изменения
Код: plsql
1.
... where id in (select ... from xmltable('...' passing xmltype(:clob) columns ...))
...
Рейтинг: 0 / 0
11.03.2017, 12:36
    #39417316
nnn2k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
Извиняюсь, совсем запутался в структуре Oracle, не часто с ним работаю.
Доп. условия: есть пользователь USER_BUH, в нем набор данных, который надо получить (select * from TBL), имея много id из xml файла.
Получается, что и схему в пользователе я не могу новую создать, так как запрет распространяется на всего пользователя. Создавать нового пользователя (USER_TMP_TBL) только ради таблицы с id номерами - не рационально, полагаю. Да и разрешения надо же сохранять внутри основного пользователя USER_BUH, в которого логинится программа оператора (сотрудника), что опять запрещено. Вероятно придется вернуться к разбивке диапазона id по нескольким выборкам (~10000 по 10-20 выборкам select).

Хотя, поразмыслив, описание временных таблиц же сохраняются в словарь Oracle, который является системным, а не пользовательским, вроде как. Остается надеяться, что это так, и разработчик БД не завернет запрос с использованием временных таблиц.

Elic,
Спасибо, это был бы замечательный вариант. Но насколько понял: xmltable ввели только в 10й версии, а у меня на производстве 9i.
...
Рейтинг: 0 / 0
11.03.2017, 12:38
    #39417317
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
nnn2kа у меня на производстве 9i.rtfm xmlsequence
...
Рейтинг: 0 / 0
12.03.2017, 00:13
    #39417478
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
[quot nnn2k]Anton_Deminnnn2k,


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


опыта на 10000 нет

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

.....
stax
...
Рейтинг: 0 / 0
13.03.2017, 10:17
    #39417881
Kumotori
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
Я сразу хочу извиниться перед уважаемым сообществом за не-Oracle.

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

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

(по питону см. : xml.etree.ElementTree и cx_Oracle)
...
Рейтинг: 0 / 0
13.03.2017, 10:25
    #39417889
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
nnn2k,
во первых совет элика, во вторых, если уж совсем руки не из Ж. видимо массив из клиента в оракл это слишком сложно..... и предвосхишая стоны насчет того, что что-то там нельзя сделать в схеме.... создать другую схему в которой можно и дать права никто не запрещает так же как и пользоваться sys.odcinumberlist, правда не помню уже были ли эти типы в 9ке. насчет отдельной схемы совет еще в силе... дай права основной схеме и работай с объектами другой.. это тоже возможно...
...
Рейтинг: 0 / 0
13.03.2017, 11:36
    #39417929
Nobody1111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
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';

тогда и без пар пойдет
...
Рейтинг: 0 / 0
13.03.2017, 18:12
    #39418329
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
Vintnnn2k,
во первых совет элика, во вторых, если уж совсем руки не из Ж. видимо массив из клиента в оракл это слишком сложно..... и предвосхишая стоны насчет того, что что-то там нельзя сделать в схеме.... создать другую схему в которой можно и дать права никто не запрещает так же как и пользоваться sys.odcinumberlist, правда не помню уже были ли эти типы в 9ке. насчет отдельной схемы совет еще в силе... дай права основной схеме и работай с объектами другой.. это тоже возможно...

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


Код: plsql
1.
2.
3.
4.
5.
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
...
Рейтинг: 0 / 0
13.03.2017, 19:55
    #39418404
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
stax..sys.odcinumberlist можно 10000 елементов?Можно даже 10001. Но конструктор поддерживает только до 1000 параметров.
...
Рейтинг: 0 / 0
13.03.2017, 20:09
    #39418416
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
-2-stax..sys.odcinumberlist можно 10000 елементов?Можно даже 10001. Но конструктор поддерживает только до 1000 параметров.
Код: plsql
1.
2.
SQL> desc sys.odcinumberlist
 sys.odcinumberlist VARRAY(32767) OF NUMBER



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

ps
10000 пар без проблем хавает слабенький сервер
......
stax
...
Рейтинг: 0 / 0
14.03.2017, 09:07
    #39418589
arlx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
Не увидел вариант попробовать вариант с with:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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
...
Рейтинг: 0 / 0
14.03.2017, 11:02
    #39418660
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
stax..,
если говорить о вызове из java например то посмотрев пример Дениса Попова за 5 год можно увидеть что он вызывает процедуру. без конструктора. смысл конкатенировать? я вызывал как select * from table((?) as odci.numberlist). не помню уже сколько я там закидывал элементов.
...
Рейтинг: 0 / 0
14.03.2017, 15:58
    #39419034
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
Vintstax..,
если говорить о вызове из java например то посмотрев пример Дениса Попова за 5 год можно увидеть что он вызывает процедуру. без конструктора. смысл конкатенировать? я вызывал как select * from table((?) as odci.numberlist). не помню уже сколько я там закидывал элементов.
так я об етом и талдычу что (?) на 10000 не прокатит

......
stax
...
Рейтинг: 0 / 0
14.03.2017, 16:02
    #39419040
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
stax..,
так я ж вначале написал что отдельная схема с правами на основную всё решает... ну а odci вспомнил как костыль.))) ну не прокатит и ладно)) я не расстроюсь))
...
Рейтинг: 0 / 0
14.03.2017, 16:50
    #39419100
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
Vintstax..,
так я ж вначале написал что отдельная схема с правами на основную всё решает... ну а odci вспомнил как костыль.))) ну не прокатит и ладно)) я не расстроюсь))
да я не против отдельной схемы, но нужны права

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

.....
stax
...
Рейтинг: 0 / 0
15.03.2017, 11:12
    #39419622
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
Если 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.
 Select * from TBL where 
     id in (1, 2, 3,..,999)
 or id in (1000, 1001, ...1999)
 or id in (...)     
...
Рейтинг: 0 / 0
04.04.2017, 21:04
    #39433170
nnn2k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select id in (1, 2, 3 ... n)
Извиняюсь, ушел в работу с головой.
Сначала маялся с установкой тестового сервера 9i на Linux, в итоге - виртуалка и Win, для экспериментов над вариантами решения вопроса.
По сути: На рабочем сервере разбил 100к запросов по 10000 - 0.2-0.6 секунд на каждые 10к. Вполне приемлемо.
То что предложил Elic (xmlsequence) - тоже успешно заработало на 9i, но пришел к предположению, что парсинг xml - это опять же лишняя нагрузка на оперативку (если конечно происходит разбивка на DOM элементы), так что plain text - вероятно дешевле. Остановился на Where id in (....) с разбивкой по 10к запросов.
Спасибо всем за помощь!
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Select id in (1, 2, 3 ... n) / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]