2014-03-31 52 views
2

我編寫了一個數據庫遷移腳本,它從SQL Server 2005連接3個表並將結果上傳到AWS數據庫。查詢是這樣的:SQL服務器選擇所有行內存的性能

SELECT a.x, b.y, c.z 
FROM Books a join Editions b on a.id = b.book_id 
join BookExtras c on c.edition_id = b.id 

Books,Editions和BookExtras表有數百萬行。 SQL服務器會將所有這些記錄加載到內存中並加入它們。一些隊友的擔憂是會增加內存壓力,腳本會崩潰。我的觀點是操作系統會分配它認爲足夠用於這個過程的任何物理內存,我們不必擔心虛擬內存機制會照顧它。

有人可以突出像上面這樣使用操作系統頁面反對在查詢本身中使用分頁來加載內存中的幾條記錄的大型查詢的利弊嗎?

回答

2

您應該研究SQL Server如何執行查詢。在這個後我找了幾個錯誤的假設:

SQL服務器將加載在內存中的所有這些記錄

目前在用許多物理連接算法,包括那些溢出到磁盤。 SQL Server在正常操作下從不使用OS分頁。它控制內存使用和溢出。

在任何情況下,並非所有正在處理的數據都必須始終駐留在內存中。

您可以連接大小爲100TB的表,並且SQL Server最終會完成它們的處理。

百萬行

的這聽起來不像很多。幾GB的數據?

我的一些隊友的擔憂是會增加內存壓力,腳本會崩潰。

它會增加內存壓力,但最有可能不會在你會注意到的方式。默認查詢內存限制爲SQL Server內存的10%。它不會因內存壓力而崩潰。 SQL Server溢出到磁盤(而不是操作系統)。

對於這樣的查詢,SQL Server是使得。該產品設計用於執行像這樣的查詢。這是一個數據倉庫式的查詢。非常好。

鑑於您不完全瞭解查詢的執行方式,並且您在短期內瞭解所有信息是不現實的,您應該在開發服務器上測試腳本。