2014-10-10 2 views
3

SO полна обходных ситуаций, но мне интересно об исторических причинах предела 1000 для «максимального количества выражений» в разделе IN?ORA-01795 - почему максимальное количество выражений ограничено 1000

+1

Для хорошего дизайна предел 1000 сам по себе большой. Практически вы не достигнете предела. Во всяком случае, я объяснил далее в своем ответе. –

+0

Я бы предположил, что ответ имеет какое-то отношение к грамматике и синтаксический анализ. И, может быть, как они были реализованы 30 лет назад. Было бы неплохо увидеть теоретический ответ компьютерной науки на это! –

+0

Можно просто спросить, почему число так высоко? –

ответ

2

Возможно, это связано с тем, что существует потенциал злоупотребления тоннами ценностей. И каждое значение в нем будет преобразовано в эквивалентное условие ИЛИ.

Например NAME IN ('JOHN', 'CHARLES'..) будут преобразованы в NAME = 'JOHN' OR NAME = 'CHARLES'

Итак, это мощь влияют на производительность ..

Но обратите внимание Oracle по-прежнему поддерживает

SELECT ID FROM EMP WHERE NAME IN (SELECT NAME FROM ATTENDEES)

В этом случае, оптимизатор не конвертируется в несколько условий ИЛИ, но вместо этого делает JOIN ..

1

Это ограничение не только для списка IN, но и в любом списке выражений. Документация говорит:

Список выражений с разделителями-запятыми может содержать не более 1000 выражений.

Ваш вопрос Почему предел . Почему не 100 или 10000 или миллион? Я предполагаю, что это связано с лимитом количества столбцов в таблице, что составляет 1000. Возможно, это отношение истинно в Oracle внутри, чтобы сделать список выражений и столбцы соответствующими выражению DML.

Но, для хорошего дизайна, предел 1000 сам по себе большой. Практически вы не достигнете предела.

И, цитата из известного сайта AskTom по аналогичной теме,

Мы потратим больше времени разбора запросов, то на самом деле их выполнения!

Update Мои собственные мысли

Я думаю, что Oracle довольно старая в технологии баз данных, что эти ограничения были сделаны, то один раз, и они никогда не приходилось думать об этом снова. Список всех выражений имеет 1000 предел. И надежный дизайн никогда не позволяет пользователям обращаться к Oracle за разъяснениями. И ответ Тома на аут-аут всегда заставляет меня думать, что все это ограничение в то время в 70-е или 80-е годы было скорее вопросом вычисления. Алгоритмы, основанные на C, возможно, необходимы некоторые ограничения и Oracle пришел ио с 1000.

Update 2: Из приложения, и это основа точки зрения

В качестве DBA, я видел так много develpers приближается ко мне с проблемами производительности, которые на самом деле являются проблемами с application framework, генерирующим запросы для извлечения данных из базы данных. Приложение предоставляет пользователям возможность добавлять filters, которые в конечном итоге образуют логику AND, OR в списке запроса IN.Внутренний Oracle расширяет его как query rewrite на этапе optimization как OR логика. И запрос становится огромным, тем самым увеличивая время до PARSE. В большинстве случаев он подавляет index usage. Таким образом, это один из случаев, когда запрос генерируется с огромным списком IN через структуру приложения.

+0

Все еще кажется произвольным. Мы можем добавить миллион выражений, почему мы не можем «использовать» миллион выражений? –

+0

Да, я согласен. Возможно, потому, что Oracle довольно устарела в технологии БД, эти ограничения были сделаны тогда один раз, и им никогда не приходилось думать об этом снова. Список всех выражений имеет 1000 предел. И надежный дизайн никогда не позволяет пользователям обращаться к Oracle за разъяснениями. И ответ Тома на аут-аут всегда заставляет меня думать, что все это ограничение в то время в 70-е или 80-е годы было скорее вопросом вычисления. Для алгоритмов, основанных на C, может потребоваться некоторый предел, а Oracle - uo с 1000. –

Смежные вопросы