我有一台連接到 SAN 的合理伺服器,它將為多個相同應用程式執行 SQL 伺服器。一個應用程式能夠讀取另一個資料庫並不存在安全性問題。
不幸的是我們也使用 32 位元 Windows。
我認為最好在伺服器上使用一個實例,啟用 AWE,以便伺服器實例可以使用我們擁有的幾乎所有內存,然後在一個實例中運行每個資料庫。
然而,我在這個問題上被 IT 部門的諸神否決了,所以我真的很想聽聽你對此的想法。從效能的角度來看,一個 SQL 實例比兩個 SQL 實例更好,我這樣說是錯誤的嗎?
我知道我們可以做一些故障轉移工作,但在一個刀片上這樣做對我來說似乎有點矯枉過正。
答案1
SQL Server 2000 和 2005 Workgroup 和 Standard(32 位,我不確定 64 位)最多僅使用 2GB 內存,因此擁有兩個實例將允許您使用完整的 4GB 內存。即使您在 x64 Windows 上執行 32 位元 SQL 標準,情況也是如此,事實上更是如此,因為您需要每 2GB 記憶體一個實例。
原則上,使用帶有兩個資料庫的單一實例比每個帶有一個資料庫的兩個實例更快,儘管我不相信這是一個巨大的差異。擁有單獨的實例對於管理很有用。例如,如果您使用 SQL 登錄,並且不同的資料庫有不同的登入集,則使用單獨的實例可以更輕鬆地追蹤登入。
所以你的問題的答案是「這取決於」:-)
JR
Re Spence 的評論:32 位元 Windows 上的 SQL Server Standard 最多可以使用 2GB 記憶體。如果使用 /3GB 開關,SQL Server Enterprise 可以使用 3GB。在具有 AWE 的 Windows 2003 Enterprise 上,至少可以使用 16GB 記憶體(可能更多),因此您可以透過執行多個 SQL Server 執行個體來充分利用記憶體。
恐怕答案還是「看情況」。如果您有大量內存,即 8GB 或 16GB,那麼您希望將最大的資料庫放在單獨的實例中,以便每個實例可以有 2GB(或 3GB 和 /3GB)。如果您只有 4GB,那麼我可能會使用單一實例和 /3GB 開關,因為擁有兩個實例所使用的少量額外記憶體不值得開銷。
正如其他人在下面評論的那樣,可能還有其他考慮因素。如果您同時引用兩個資料庫,例如在選擇查詢中或從一個資料庫插入另一個資料庫,那麼您希望它們位於同一實例中以提高速度。
答案2
32位是死胡同。
在 SQL2K5 中,計劃編譯、計劃大小本身以及過程快取等記憶體消耗顯著增加超過 2k。如果您有很多使用者(即大型組織和中層模擬),其他元件(例如權限令牌快取)往往會成長。由於所有這些都無法從 AWE 中受益,因此您很難將繁忙的系統裝入 32 位元記憶體空間。如果您有複雜的查詢和計劃,聚合實例可能會導致很高比例的緩衝池被竊取到這些緩存,從而為資料留下一個小的緩衝池,從而導致編譯計劃的不斷緩存驅逐和較低的頁面生命週期預期。
另一方面,同一個機器上的多個 SQL 實例往往會互相踩到對方的腳趾,從而引發彼此的記憶體壓力。由於實例的記憶體管理器不相互通信,因此與單一實例相比更難找到平衡。此外,多個執行個體的處理器調度可能會遇到類似的問題,因為作業系統會搶佔執行個體中的 SQL 調度程序,導致 CPU 快取垃圾。
答案3
恕我直言,我想說你們這些 IT 之神在這一點上是錯的。只要在同一個實例中執行多個資料庫不存在安全性問題,就可以採用這種方法。多實例總是會帶來一些開銷,這實際上會為您的伺服器帶來次優的效能。從管理角度來看,最好堅持使用一個實例。
答案4
一如既往,這取決於:資料庫是否需要相互「對話」?
如果是針對同一個應用程序,您經常會遇到需要一個資料庫讀取或寫入另一個資料庫的情況。如果是這種情況,最好在單一實例上使用兩個資料庫。 (無連結伺服器、共享登入、共享 tempdb 都是這裡的優點。)
但是,如果這兩個資料庫完全隔離,永遠不會相互通信,並且實際上彼此之間沒有任何遠端關係(即 SharePoint 和 SAP),那麼兩個實例可能更可取。 (在不同 Service Pack 等級運作的能力,或限制一個實例使用的記憶體是我腦海中浮現的兩個優點。)