Sql-Server

跨多個文件(在文件組中)分佈表數據是否會提高性能?

  • May 17, 2021

從文件組的產品文件中

例如:Data1.ndfData2.ndfData3.ndf, 可以分別在三個磁碟驅動器上創建,並分配給文件組 fgroup1。然後可以專門在文件組上創建一個表 fgroup1。從表中查詢數據將分佈在三個磁碟上;它將提高性能。

我知道如果有一個非常大的表,並且如果我將它放在具有單個文件的文件組中並且如果它位於單獨的磁碟上,那麼它將提高性能,因為對這個大表的所有查詢都將轉到單獨的磁碟。

我也知道使用多個文件組進行表分區;每個文件組包含一個或多個文件。但是,此問題專門針對未分區大表場景中的文件組。

在上面的例子中,作者說即使文件組包含多個文件,性能也會有所提高。我對此感到困惑,因為如果一個表分佈在多個文件中,那麼這不會導致性能下降(因為行將分佈在文件中,因此從一行到下一行可能在另一個文件上,不會它會影響性能)?

正如其他使用者所指出的,這不會提高性能。它確實提供了兩個重要的功能。

  1. 您可以在不移動數據庫的情況下向數據庫添加空間和 IO 容量,方法是添加新磁碟並將新文件添加到文件組並將它們放置在新磁碟上,或者將一些現有文件移動到新磁碟上。
  2. 通過將文件分散到多個磁碟上,您可以將數據庫還原到沒有足夠大的捲用於整個數據庫的伺服器上。

因為這些行將分佈在文件中,所以從一行到下一行可能在另一個文件上,它不會影響性能嗎?

不會。SQL Server 總是讀取至少 8KB 的頁面;它從不從磁碟讀取一行。“下一頁”是否在同一個文件中無關緊要。SQL Server 將使用 8 頁Extents為對象分配空間,因此在順序讀取時,您通常會從每個文件讀取至少 64KB,然後再從下一個文件讀取。

為了支持建立在簡單的旋轉磁碟陣列上的老式數據倉庫配置,有一個啟動參數 -E “增加為文件組中的每個文件分配的範圍數。”,但在現代儲存解決方案中,這很少見甚至在 DW 配置中使用。

多個文件背後的想法源於磁碟存在更大的硬體性能瓶頸時。將數據庫拆分到多個磁碟上的多個文件是一種提高性能的方法,因為它不受單個磁碟的****I/O速度的限制,尤其是對於並行程序或併行查詢。理論上可以從磁碟並行載入數據。即使是串列執行並需要跨多個磁碟訪問多個文件的查詢也沒有看到可衡量的性能損失(因為跨兩個磁碟定位行幾乎不需要額外的時間)。

現在有了像 NVMes 和雲儲存選項這樣的磁碟,這種方法隨著時間的推移變得不那麼重要了。

引用自:https://dba.stackexchange.com/questions/291684