Secondo i miei libri di lettura su SQL Server 2008 Internals e risoluzione dei problemi (presi in prestito dalla biblioteca locale in Illinois) da Christian Bolton, Brent Ozar ecc. Sto cercando di cercare comprensione e conferma su SQL Server e molte ricerche sul Web apprezzerei se qualcuno può confermare o correggere la mia comprensione.
Ogni query o operazione che richiede la concessione di memoria di query richiederà memoria dello spazio di lavoro. In generale, le query che usano Ordina, Hash Match Join, Parallelism (non sono sicuro), Bulk Insert (non sono sicuro), Index Rebuild ecc. Necessitano di memoria dell'area di lavoro della query.
La memoria dell'area di lavoro fa parte del pool buffer di SQL Server (è allocata come parte del pool buffer) e la memoria massima dell'area di lavoro è il 75% della memoria allocata al pool buffer. Per impostazione predefinita, una singola query non può ottenere più del 25% della memoria dell'area di lavoro (in SQL 2008 / SQL 2012 - controllata dal gruppo di carichi di lavoro predefinito di Resource Governor immediatamente).
Cerco una conferma della mia comprensione
1) Considerando che il sistema con 48 GB di RAM e la memoria massima del server configurata su 40 GB significa che la memoria massima dell'area di lavoro è limitata a 30 GB e una singola query non può ottenere memoria dell'area di lavoro (memoria delle query) più di 10 GB. Quindi, se hai una brutta query che lavora con un miliardo di righe che sta eseguendo un massiccio hash join e hai bisogno di più di 10 GB di memoria (memoria dello spazio di lavoro), ti interesserebbe anche passare attraverso questa coda di concessione della memoria o versare immediatamente sul disco?
2) Se a una query che esegue un'operazione di ordinamento di massa è stata assegnata una memoria dell'area di lavoro di 5 MB e durante l'esecuzione della query della query se l'ottimizzatore della query si rende conto che a causa di statistiche errate o indici mancanti questa query avrà effettivamente bisogno di 30 MB di memoria dell'area di lavoro si riverserà immediatamente su tempdb. Anche se il sistema ha molta memoria dell'area di lavoro disponibile durante l'esecuzione una volta che la query ha superato la memoria dell'area di lavoro concessa durante l'esecuzione, dovrà essere riversata sul disco. La mia comprensione è corretta?