2010-11-02 14 views
7

Intendo, nei termini delle query SQL, sono compilati o interpretati a un livello basso ?. Come funziona internamente, È un'istruzione SQL interpretata o compilata ?.È un DBMS (MySQL, SQL Server ....) Interpretato o compilato?

+0

Stai chiedendo su MySQL specificamente, o qualsiasi DBMS? Perché diversi DBMS si trovano in punti diversi dello spettro compile-vs- – einpoklum

risposta

11

E 'in genere di lavoro in questo modo:

 
    SQL String ---[Optimizer]---> Execution Plan ---[Execution]---> Result 

Personalmente mi piace vedere l'ottimizzatore (query planner) come qualcosa di molto simile a un compilatore. Trasforma l'istruzione SQL in qualcosa che è più facilmente eseguibile. Tuttavia, non è eseguibile sul chip. Questa "compilation" è piuttosto costosa, proprio come la compilazione del codice C++. Questa è la parte in cui vengono valutate diverse varianti di esecuzione; l'ordine di join, quale indice utilizzare e così via. È buona norma evitare questo quando possibile utilizzando i parametri di collegamento .

Il piano di esecuzione viene quindi acquisito per l'esecuzione dal database. Tuttavia, la strategia è già stata risolta. l'esecuzione lo sta solo facendo. Questa parte è un po 'come interpretare il piano di esecuzione, non l'SQL.

Dopotutto, è in qualche modo simile a Java o .NET dove la compilazione trasforma il codice sorgente in un formato binario che può essere interpretato più facilmente. Se ignoriamo JIT per questo argomento, l'esecuzione di un programma Java sta interpretando questo meta-codice.


Ho usato questo modo di spiegare il beneficio della using bind parameters for (Oracle) performance nel mio free eBook "Use The Index, Luke".

+0

Per favore correggimi se ho torto: potresti aggiungere che lo Strumento di ottimizzazione può usare il caching per il piano di esecuzione, il che spiegherebbe il vantaggio dei parametri di bind. – bvh

0

Negli ambienti SQL moderni è un approccio graduale in cui si prende una decisione a un certo livello del flusso di lavoro, indipendentemente dal fatto che si desideri riutilizzare o il blocco compilato esistente o riavviare tutte le fasi se si ottiene un piano migliore per una certa combinazione di argomenti.

Penso che sia un guadagno tra (ri) compilazione e tempo di esecuzione del risultato (quindi compilato in codice eseguibile). A seconda della complessità della query, una ricompilazione che applica le specifiche degli argomenti specificati in fase di esecuzione potrebbe non valere la pena se il tempo di esecuzione del codice esistente è già basso a causa del consumo minimo prevedibile di risorse (ad esempio, leggere due righe e restituire).

Con una maggiore complessità delle query e un consumo stimato di risorse (molte tabelle enormi coinvolte, scelta di indice cruciale, scansione possibile della tabella), entra in gioco la granularità delle statistiche. cioè se hai selettività, valori anomali, selettività di gamma, av. dimensioni del campo, dimensioni della mappa fisica, ecc. l'ottimizzatore può arrivare a conclusioni molto diverse con diversi gruppi di argomenti.

Calcolare il piano migliore per un'istruzione 25-join con argomenti variabili 10 ++ potrebbe richiedere tempo e risorse. Se il risultato è più veloce e più efficiente della versione one-for-all, vale la pena. Soprattutto il dato insieme di argomenti può contenere cambi di gioco e la query verrà rieseguita frequentemente.

Infine, la situazione potrebbe essere diversa con ogni fornitore;)

Problemi correlati