2013-09-25 5 views
5

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?

+0

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') –

+0

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

+0

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. –

risposta

8

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.

+1

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. –

1

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.

+1

'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. –

0

Provare a utilizzare "esiste" rispetto a "in". È anche possibile creare sottocartelle utilizzando "esiste".

Problemi correlati