sql
  • oracle
  • performance
  • 2011-11-21 13 views 5 likes 
    5

    Non ho "spiegare il piano" a portata di mano. Potrebbe aiutare a dire quale dei seguenti è più efficiente?Ottimizzazione delle prestazioni SQL per Oracle Molti OR vs IN()

    Opzione 1:

    select ... 
        from VIEW_ABC 
        where STRING_COL = 'AA' 
         OR STRING_COL = 'BB' 
         OR STRING_COL = 'BB' 
         OR ... 
         OR STRING_COL = 'ZZ' 
    

    Opzione 2:

    select ... 
        from VIEW_ABC 
        where STRING_COL IN ('AA','BB',...,'ZZ') 
    
    +0

    Questa domanda è aperta a qualsiasi database e diversi ottimizzatori avranno implementazioni differenti. La risposta accettata per quella domanda è specifica per MySQL. Un'altra delle risposte ad alta votazione parla di Oracle. – givanse

    risposta

    2

    Vorrei assumere l'ottimizzatore potrebbe trattare entrambe le versioni della stessa. IN è in realtà solo una sintassi sintattica per più istruzioni OR.

    6

    Questa è una domanda simile: IN vs OR of Oracle, which faster?

    Guardate la risposta data da OMG Ponies, egli suggerisce che IN è più ottimizzato rispetto OR.

    C'è anche questa domanda: IN vs OR in the SQL WHERE Clause

    Anche se è non specifico database, ha alcune buone risposte dal punto di vista di Oracle.

    Per quello che vale, l'uso di IN sarebbe molto più facile da leggere e quindi più facile da supportare a lungo termine. Questo da solo potrebbe influenzare la tua scelta, soprattutto se (come sospetto) l'ottimizzatore Oracle li tratta allo stesso modo.

    Se, tuttavia, il tuo elenco di valori è molto grande, probabilmente dovresti esaminare un metodo completamente diverso per il recupero dei risultati.

    0

    L'ottimizzatore continuerà a utilizzare e indicizzare, se ne esiste uno sulla colonna String_Col. Al fine di mantenere una dimensione decente dell'SQL per aiutare l'analisi, quindi piuttosto che avere Oracle analizza una stringa di caratteri 250-500, si sta meglio, mettendo tutti i possibili valori in una tabella temporanea o in una tabella pl/sql e quindi si uniscono in questo modo -

    Select/* + use_nl ordinata (x) */* da pl/sql_table, view_abc x dove x.string_col = pl/sql_table.value

    +0

    Ma suggerimenti e una tabella temporanea possono aggiungere molti altri potenziali problemi. Ora l'ottimizzatore deve capire un'altra tabella. Il sovraccarico di tale tabella aggiuntiva potrebbe essere maggiore della riduzione del tempo di analisi da una stringa di query più piccola. E se l'ottimizzatore stima che la tabella temporanea in modo errato può portare a problemi come non utilizzare l'eliminazione delle partizioni. Se la prestazione è l'obiettivo principale, è necessario fornire quante più informazioni possibili all'ottimizzatore, come ad esempio i letterali di grandi dimensioni con hard-coding. –

    1

    L'ottimizzatore di Oracle convertirà IN-liste alle catene OR. Questo ti permette di fare il OR-expansion transformation che può ottimizzare ulteriormente la tua query. Inoltre, potrebbe essere in grado di generare predicati transitivi che potrebbero velocizzare la query.

    Avendo tutto uguale in due query, costrutti o trasformazioni, non ci sarà differenza tra l'utilizzo di IN o OR. IN sarà trasformato in catene OR.

    Problemi correlati