La clausola Oracle IN ha un limite di 1000 per i dati statici, ma accetta dati illimitati da sottocategorie. perché?Perché la clausola oracle IN ha limite di 1000 solo per dati statici?
risposta
Si tratta di una restrizione qualsiasi expression list:
Un elenco delimitato da virgole di espressioni può contenere non più di 1000 espressioni.
Perché 1000? Presumibilmente, l'implementazione ha bisogno di una sorta di limite e probabilmente è sembrato più che sufficiente. Potrebbero esserci, o certamente potrebbero essere stati quando il limite è stato impostato decenni fa, un motivo di prestazioni anche per il limite, in particolare perché lo IN
viene convertito in più OR
istruzioni dall'ottimizzatore in questo caso (che puoi vedere se guarda il piano di esecuzione).
Avrei difficoltà a trovare uno scenario ragionevole che fosse necessario per avvicinarsi a questo, con valori fissi che non potevano essere derivati da altri dati comunque come sottoquery.
Sospetto che sia in qualche modo correlato allo logical database limits che dice che non è possibile avere più di 1000 colonne in una tabella, ad esempio; poiché un elenco di espressioni viene utilizzato in un'istruzione di inserimento per elencare sia le colonne che i valori inseriti, l'elenco di espressioni deve essere in grado di farlo corrispondere, ma forse non ha motivo di superarlo.
Speculazione del corso ... senza vedere le parti interne del software è improbabile che si ottenga una risposta definitiva.
Interessante correlazione tra il numero di colonne e il numero di elementi in un elenco di espressioni. Non ho mai pensato che questo potesse essere collegato. –
Questo perché IN ha prestazioni molto scarse con un numero elevato di valori nell'elenco. È solo una scorciatoia per la clausola OR, e a livello di database il motore cambierà IN in OR.
Si dovrebbe anche evitare di fare subquery all'interno della clausola IN - meglio usare EXISTS.
'IN' e' EXISTS' sono logicamente equivalenti. Vengono elaborati allo stesso modo dall'ottimizzatore Oracle. Dovresti usare uno di questi a tua discrezione, non importa dal punto di vista delle prestazioni. –
Provare a utilizzare "esiste" rispetto a "in". È anche possibile creare sottocartelle utilizzando "esiste".
- 1. oracle dove in limitazione a 1000/hibernate
- 2. tipo di dati oracle raw in where clausola
- 3. Perché la partizione Spark RDD ha un limite di 2 GB per HDFS?
- 4. clausola di Oracle CONNECT BY dopo clausola GROUP BY
- 5. Come aggiungere la clausola limite utilizzando il provider di contenuti
- 6. perché 24 * 60 * 60 * 1000 * 1000 diviso per 24 * 60 * 60 * 1000 non uguale a 1000 in Java?
- 7. Raccolta Oracle nella clausola where
- 8. Perché Magento mantiene solo i primi 1000 prodotti in una categoria, dopo aver salvato la categoria?
- 9. imposta solo limite inferiore di un limite per ggplot
- 10. Utilizza parametro in clausola simile in oracle
- 11. dati statici in Kotlin
- 12. Oracle case inside where clausola
- 13. Perché la firma runState ha solo argomenti di stato?
- 14. Per-Richiesta dati statici in ASP.NET
- 15. Recordset che restituisce solo 1000 record
- 16. Perché un membro di dati statici non può essere inizializzato?
- 17. In classe inizializzazione di membri dati statici
- 18. Esempio di clausola PIVOT Oracle con sottoquery
- 19. Perché non riesco a eliminare righe da questa vista che ha funzione di aggregazione nella clausola select (ORACLE)?
- 20. ORACLE Collega per clausola equivalente in SQL Server
- 21. Perché supera il limite di 65.535 byte nei costruttori Java e negli inizializzatori statici?
- 22. Perché devo moltiplicare unix timestamp per 1000 in JavaScript?
- 23. WebSockets ha un limite di throughput?
- 24. Perché solo ASP.NET ha un modello di programmazione asincrona?
- 25. Set di caratteri JDBC Oracle e limite di 4000 caratteri
- 26. Dati statici nelle librerie di sola intestazione
- 27. Dati statici Inizializzazione dei membri
- 28. come aggiungere clausola limite per manageQuery su Android
- 29. perché solo viewWillAppear ha richiamato la navigazione indietro
- 30. Perché Linq ignora la mia clausola where?
Non mettere in dubbio l'angoscia Oracle, è vietato per l'utente comune: D Sto solo scherzando. Puoi sovrascriverlo con WHERE par_id IN ('a', 'b', ..., 'z') O par_id IN ('o', 'pr' ... 'zd') –
Numerosi modi per sovrascriverlo (Ho trovato 3 o 4 in stackexhange) .. Ma la ragione potrebbe essere semplicemente come i vincoli di base in Oracle pre carico, max byte in query ecc. – SriniV
Se hai più di una dozzina di voci, dovresti usare una subquery di qualche sorta comunque. 1000 è un limite arbitrariamente grande - probabilmente già troppo grande. –