2013-09-25 7 views
5

Klauzula Oracle IN ma limit 1000 dla danych statycznych, ale akceptuje nieograniczoną ilość danych z pod-zapytań. czemu?Dlaczego klauzula IN w zdaniach ma limit 1000 tylko dla danych statycznych?

+0

Nie kwestionuj Oracle Mightiness, jest zabronione dla zwykłego użytkownika: D Żartuję. Możesz zastąpić go WHERE par_id IN ('a', 'b', ..., 'z') LUB par_id IN ('lub', 'pr' ... 'zd') –

+0

Liczne sposoby na obejście tego (Znalazłem 3 lub 4 w stackexhange). Ale powód może po prostu być jak podstawowe ograniczenia w preload obciążenia Oracle, max bajty w kwerendie itp. – SriniV

+0

Jeśli masz więcej niż kilkanaście wpisów, powinieneś używać podkwerendy coś w tym rodzaju. 1000 to arbitralnie duży limit - prawdopodobnie już zbyt duży. –

Odpowiedz

8

To ograniczenie jakiegokolwiek expression list:

rozdzielany przecinkami lista wyrażeń może zawierać nie więcej niż 1000 wyrażeń.

Dlaczego 1000? Prawdopodobnie wdrożenie wymaga pewnego rodzaju ograniczenia, co prawdopodobnie wydawało się więcej niż wystarczające. Być może zdarzyłoby się, lub z pewnością, kiedy ten limit został ustalony dekadę temu, przyczyna wydajności również dla limitu, szczególnie, że IN jest konwertowany na wiele instrukcji OR przez optymalizator w tym przypadku (co można zobaczyć, jeśli spójrz na plan wykonania).

Ciężko byłoby mi wymyślić rozsądny scenariusz, który musiałby zbliżyć się do tego, ze stałymi wartościami, które i tak nie mogły zostać uzyskane z innych danych jako podzapytanie.

Podejrzewam, że jest to trochę związane z logical database limits, które mówią, że nie można na przykład mieć więcej niż 1000 kolumn w tabeli; ponieważ lista wyrażeń jest używana w instrukcji insert w celu wyświetlenia zarówno kolumn, jak i wstawianych wartości, lista wyrażeń musi być w stanie ją dopasować, ale być może nie ma powodu, aby ją przekraczać.

Spekulacje oczywiście ... bez oglądania wewnętrznych elementów oprogramowania, na które raczej nie można uzyskać ostatecznej odpowiedzi.

+1

Interesująca zależność między liczbą kolumn a liczbą elementów na liście wyrażeń. Nigdy nie myślałem, że to może być powiązane. –

1

Dzieje się tak, ponieważ IN ma bardzo słabą wydajność z dużą liczbą wartości na liście. Jest to skrót skrótu do klauzuli OR, a na poziomie bazy danych silnik zmieni się na OR.

Powinieneś także unikać wykonywania podkwerend wewnątrz klauzuli IN - lepiej korzystaj z EXISTS.

+1

'IN' i' EXISTS' są logicznie równoważne. Są one przetwarzane w ten sam sposób przez optymalizator Oracle. Powinieneś użyć dowolnego z nich według swojego uznania, nie będzie to miało znaczenia z punktu widzenia wydajności. –

0

Spróbuj użyć "exist", a nie "in". Możesz również tworzyć podkwerendy używając "exist".

Powiązane problemy