Mysql
 sql >> Database >  >> RDS >> Mysql

L'ordine delle tabelle nei join diretti, senza direttive di suggerimento, influisce sulle prestazioni?

Risposta alla tua domanda - Sì, l'ordine del tavolo fa la differenza in join.

Puoi anche informare l'ottimizzatore del piano di esecuzione.

L'hint ORDERED fa sì che Oracle unisca le tabelle nell'ordine in cui appaiono nella clausola FROM.

Ad esempio, questa istruzione unisce la tabella TAB1 alla tabella TAB2 e quindi unisce il risultato alla tabella TAB3:

 SELECT /*+ ORDERED */ TAB1.COL1, TAB2.COL2, TAB3.COL3
     FROM TAB1, TAB2, TAB3
    WHERE TAB1.COL1 = TAB2.COL1
         AND TAB2.COL1 = TAB3.COL1;

Se si omette l'hint ORDERED da un'istruzione SQL che esegue un join, l'ottimizzatore sceglie l'ordine in cui unire le tabelle. Potresti voler utilizzare l'hint ORDERED per specificare un ordine di unione se sai qualcosa sul numero di righe selezionate da ciascuna tabella che l'ottimizzatore non conosce. Tali informazioni ti permetterebbero di scegliere una tabella interna ed esterna meglio di quanto potrebbe fare l'ottimizzatore.

Di solito, se si analizzano le tabelle, l'ottimizzatore seleziona un piano a stella efficiente. Puoi anche utilizzare i suggerimenti per migliorare il piano. Il metodo più preciso consiste nell'ordinare le tabelle nella clausola FROM nell'ordine delle chiavi nell'indice, con la tabella grande per ultima. Quindi utilizzare i seguenti suggerimenti:

/*+ ORDERED USE_NL(FACTS) INDEX(FACTS FACT_CONCAT) */