Oracle
 sql >> Database >  >> RDS >> Oracle

Perché la clausola Oracle IN ha un limite di 1000 solo per i dati statici?

È una restrizione su qualsiasi elenco di espressioni:

Un elenco di espressioni delimitato da virgole non può contenere più di 1000 espressioni.

Perché 1000? Presumibilmente l'implementazione necessita di una sorta di limite, e questo probabilmente sembrava più che sufficiente. Potrebbe esserci, o certamente potrebbe esserci stato quando quel limite è stato fissato decenni fa, anche un motivo di performance per il limite, in particolare come IN viene convertito in più OR dichiarazioni dell'ottimizzatore in questo caso (che puoi vedere se guardi il piano di esecuzione).

Avrei faticato a trovare uno scenario ragionevole che avesse bisogno di avvicinarsi a quello, con valori fissi che non potevano comunque essere derivati ​​da altri dati come sottoquery.

Sospetto che sia in qualche modo correlato ai limiti logici del database che dicono che non puoi avere più di 1000 colonne in una tabella, per esempio; poiché un elenco di espressioni viene utilizzato in un'istruzione insert per elencare sia le colonne che i valori inseriti, l'elenco di espressioni deve essere in grado di corrispondere a quello, ma forse non ha motivo di superarlo.

Speculazioni ovviamente... senza vedere l'interno del software è improbabile che tu ottenga una risposta definitiva.