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?
Odpowiedz
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.
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. –
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.
'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. –
Spróbuj użyć "exist", a nie "in". Możesz również tworzyć podkwerendy używając "exist".
- 1. Dlaczego partycja Spark RDD ma limit 2 GB dla HDFS?
- 2. Korzystanie IN() Klauzula powstałego w filesort
- 3. Zmienna LIMIT Klauzula w MySQL
- 4. Cassandra Limit 10,20 klauzula
- 5. Podstawienie parametru dla SQLite "IN" klauzula
- 6. Gdzie klauzula IN w LINQ
- 7. Klauzula MySql IN, próbująca dopasować listę IN krotek
- 8. Cloud Parse Limit 1000 pokonany przez Chaining?
- 9. C# Sparametryzowane zapytanie MySQL z `in` klauzula
- 10. SQL gdzie klauzula z LIKE i IN
- 11. Dlaczego tylko ASP.NET ma asynchroniczny model programowania?
- 12. Maksymalny rozmiar zapytania SQL Server? Klauzula IN? Czy istnieje lepsze podejście
- 13. zestaw danych statycznych dla komórek UITableView
- 14. Klauzula SQL IN gwarantowana do oceny fałszywej
- 15. Czy WebSockets ma limit przepustowości?
- 16. W jaki sposób klauzula IN wpływa na wydajność w Oracle?
- 17. Czy klauzula LIMIT w HIVE jest naprawdę losowa?
- 18. TensorFlow: Saver ma limit 5 modeli
- 19. ostrzegawcze: zmienne wejściowe przekroczyła 1000
- 20. Dlaczego doktryna używa GDZIE IN zamiast LIMITU?
- 21. Limit wierszy dla tabeli danych w R przy użyciu fidry
- 22. Usuwanie danych statycznych onDestroy()
- 23. jak używać ciągu znaków, który zawiera "w SQL" IN "klauzula
- 24. Klauzula IN z danymi sprężynowymi i Cassandra @Query
- 25. Klauzula "w" w anormie?
- 26. Czy java ma odpowiednik C# "using" klauzula
- 27. Dlaczego mój webhost serwisu Github ma limit czasu?
- 28. Ładowanie obrazów dla obrazów statycznych
- 29. Obsługa wyjątków C#, której klauzula catch ma zastosowanie?
- 30. Zapisywanie ponad 1000 rekordów do bazy danych w czasie
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') –
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
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. –