Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как помещать более 1000 значений в оператор IN? / 20 сообщений из 20, страница 1 из 1
05.09.2018, 07:52
    #39698173
Festani_10
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как помещать более 1000 значений в оператор IN?
Столкнулся с проблемой что нужно поместить в данный оператор более 1000 значений, есть ли способ обойти это ограничение?
...
Рейтинг: 0 / 0
05.09.2018, 07:54
    #39698174
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как помещать более 1000 значений в оператор IN?
where (a, 1) in ((1, 1), (2, 1),...(1000,1))
...
Рейтинг: 0 / 0
05.09.2018, 08:06
    #39698176
nata44845
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как помещать более 1000 значений в оператор IN?
Festani_10,

Через OR
Через временную таблицу еще делают
...
Рейтинг: 0 / 0
05.09.2018, 09:21
    #39698200
IMNO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как помещать более 1000 значений в оператор IN?
Можно через коллекцию.
Оператор MEMBER OF .

Только тип коллекции должен быть объявлен на уровне схемы.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
DECLARE 
  /*
    t_table_int - тип коллекции, объявленный на уровне схемы
    TYPE t_table_int  IS TABLE OF NUMBER(10);
  */
  r_digits t_table_int := t_table_int();
  v_cursor SYS_REFCURSOR;
BEGIN
  r_digits.EXTEND(1000);
  
  FOR i IN 1..1000
  LOOP
    r_digits(i) := i;
  END LOOP;
  
  OPEN :v_cursor FOR
    SELECT 1
    FROM YOURS_TABLE
    WHERE column MEMBER OF r_digits;
END;
...
Рейтинг: 0 / 0
05.09.2018, 09:42
    #39698207
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как помещать более 1000 значений в оператор IN?
да, слушай больше про коллекции. чтобы оптимизитор не оценил кардинальность, не заюзал индексы и прочее. но как показывает мой опыт если в in надо передать более 1000 это либо проблемы с днк, либо с архитектурой.
...
Рейтинг: 0 / 0
05.09.2018, 10:26
    #39698237
nata44845
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как помещать более 1000 значений в оператор IN?
Shtock,

А вот тут поддержу, даже при том что у нас разработчики используют временные таблицы (куда заранее отбирают данные), оптимизатор не может оценить их кардинальность.
Возможно просто запросом было бы лучше.
...
Рейтинг: 0 / 0
05.09.2018, 10:27
    #39698239
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как помещать более 1000 значений в оператор IN?
Shtockно как показывает мой опыт если в in надо передать более 1000 это либо проблемы с днк, либо с архитектурой.Где находится то граничное число, начиная с которого можно говорить о проблемах с ДНК или архитектурой? И как все-таки отличить первое от второго?
...
Рейтинг: 0 / 0
05.09.2018, 10:31
    #39698243
nata44845
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как помещать более 1000 значений в оператор IN?
AmKad,

Пример приведу. В одной таблице и продукты и партии. Партий на миллионы.
Продуктов на 150 тысяч, но отбирают их с завязкой на производителя IN (...)

Когда производителей в IN достаточно начинается FULL_SCAN всей таблицы товаров (вместе с партиями).
Благо у нас скорости хорошие.
...
Рейтинг: 0 / 0
05.09.2018, 10:39
    #39698250
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как помещать более 1000 значений в оператор IN?
nata44845Продуктов на 150 тысяч, но отбирают их с завязкой на производителя IN (...)Ну так я могу подгадать случаи, когда и для одного значения FTS будет, или наоборот, для двух тысяч значений - index range scan.

Граничная чиселка, чиселка-то где?
...
Рейтинг: 0 / 0
05.09.2018, 10:41
    #39698251
nata44845
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как помещать более 1000 значений в оператор IN?
AmKad,

"Чиселка" в том, что разработчик зачем-то пихнул в одну таблицу разные данные - косяк в архитектуре.
...
Рейтинг: 0 / 0
05.09.2018, 11:11
    #39698275
Festani_10
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как помещать более 1000 значений в оператор IN?
Все довольно просто есть справочник в котором более 1000 значений.
и на репортинг надо выбрать в фильтре все значения, выбирается через оператор IN из определенного поля этого справочника. выдает ошибку т.к. в переменную передается более 1000 значений.

AmKadnata44845Продуктов на 150 тысяч, но отбирают их с завязкой на производителя IN (...)Ну так я могу подгадать случаи, когда и для одного значения FTS будет, или наоборот, для двух тысяч значений - index range scan.

Граничная чиселка, чиселка-то где?
...
Рейтинг: 0 / 0
05.09.2018, 11:14
    #39698281
merch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как помещать более 1000 значений в оператор IN?
Festani_10, эта проблема известна всем давно. Добавь union all-ом кастом значение "Выбрать все" и обрабатывай уже его.
...
Рейтинг: 0 / 0
05.09.2018, 11:33
    #39698292
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как помещать более 1000 значений в оператор IN?
Festani_10Все довольно просто


21664984

.....
stax
...
Рейтинг: 0 / 0
05.09.2018, 21:23
    #39698749
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как помещать более 1000 значений в оператор IN?
В целом я наблюдаю весьма часто в нашем приложении, когда разработчики среднего слоя складывают по 2, 3 тысячи айдишников в IN и начинают недоумевать вместо того, чтоб либо сложить их во временную таблицу и это реально получается быстрее либо просто подумать и передать не айдишники, а, например, код группы, которая включает в себя эти айдишники.
...
Рейтинг: 0 / 0
05.09.2018, 22:08
    #39698754
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как помещать более 1000 значений в оператор IN?
Shtockвременную таблицуА если мультизвенка с пулом?
...
Рейтинг: 0 / 0
06.09.2018, 00:14
    #39698784
SkilledJunior
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как помещать более 1000 значений в оператор IN?
Festani_10Все довольно просто есть справочник в котором более 1000 значений.
и на репортинг надо выбрать в фильтре все значения, выбирается через оператор IN из определенного поля этого справочника. выдает ошибку т.к. в переменную передается более 1000 значений.

Почему нельзя сделать in (select ... from справочник where условие для справочника сформированное фильтром в приложении) ?
...
Рейтинг: 0 / 0
06.09.2018, 00:17
    #39698786
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как помещать более 1000 значений в оператор IN?
SkilledJuniorFestani_10Все довольно просто есть справочник в котором более 1000 значений.
и на репортинг надо выбрать в фильтре все значения, выбирается через оператор IN из определенного поля этого справочника. выдает ошибку т.к. в переменную передается более 1000 значений.

Почему нельзя сделать in (select ... from справочник where условие для справочника сформированное фильтром в приложении) ? IN и есть фильтр.
...
Рейтинг: 0 / 0
06.09.2018, 00:37
    #39698787
SkilledJunior
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как помещать более 1000 значений в оператор IN?
Пользователь тыкает мышкой более тысячи галочек?

Может посчитать в приложении сколько значений пойдет в условие in и сколько в not in, например пользователь выбрал все, значит in вообще ненужен просто выбирается весь справочник, если пользователь выбрал все, а потом снял выбор с нескольких значений то можно использовать not in, в общем можно как то творчески подойти к формированию условия и ограничению фильтра.
...
Рейтинг: 0 / 0
06.09.2018, 00:41
    #39698788
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как помещать более 1000 значений в оператор IN?
Там еще и на грабли с максимальной длинной оператора можно наступить, 3 МБ кажется.
...
Рейтинг: 0 / 0
06.09.2018, 15:52
    #39699126
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как помещать более 1000 значений в оператор IN?
Relic Hunter А если мультизвенка с пулом?


именно она, но как раз таки когда у нас такие ситуации это всё происходит в рамках одной транзакции, так что в этот момент коннект к БД держится и проблемы нет.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как помещать более 1000 значений в оператор IN? / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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