Forse non tutti sanno che quando una query viene compilata (ossia viene prodotto il piano di esecuzione) SQL Server deve procedere ad allocare diversa memoria per fare in modo che tutte le fasi della compilazione (parsing, algebrization, optimization) possano essere effettivamente compiute.
La quantità di memoria necessaria varia durante la compilazione in funzione della complessità della query e di che grado di ottimizzazione deve essere applicata. Per evitare che una singola query possa consumare tutta la memoria disponibile e quindi rendere il sistema instabile, ci sono tre “gateway” che governano quante query possono essere compilate simultaneamente in funzione della quantità di memoria di cui necessitano.
Fino a SQL Server 2016 query che necessitavano di molta RAM, venivano limitate ad una sola compilazione per volta, e questo, nel caso di più una query complessa da compilare porta all’attesa della query sul wait type
RESOURCE_SEMAPHORE_QUERY_COMPILE
Dato che l’aumentare dei dati e della complessità dei database porta a scrivere query sempre più complesse, in SQL Server 2016 è stato deciso di modificare questo comportamento, per renderlo più dinamico e quindi più adatto alle esigenze moderne. Qui il dettaglio direttamente dal team di sviluppo:
Multi-fold increase in throughput for big gateway query compiles in SQL Server