資料庫優化不僅是 DBA 的專利,開發人員同樣應掌握核心技巧。本文整理三大關鍵主題:檔案/檔案群組組織、大型資料表分區策略、T-SQL 模板標準化管理,助你建立高效、可維護的 SQL Server 環境。
新建資料庫時會自動建立 PRIMARY 檔案群組並設為預設。所有使用者物件預設寫入 PRIMARY(即 .mdf)。若要將使用者物件導向 .ndf,需:
ALTER DATABASE ... ADD FILEGROUP ...; ALTER DATABASE ... MODIFY FILEGROUP ... DEFAULTALTER DATABASE ... ADD FILE ... TO FILEGROUP ...將大型資料表拆分為多個較小的物理儲存單元(分區),查詢時只掃描相關分區,遵循「分而治之」原則。當其他優化手段用盡、百萬列以上大表查詢仍緩慢時,應考慮分區。
| 類型 | 說明 | 適用情境 |
|---|---|---|
| 水平分區 | 依資料列範圍(如 ID、日期)切分,結構相同 | 單表列數極大,如訂單、記錄檔 |
| 垂直分區 | 依欄位切分,常用欄位與不常用欄位分離 | 欄位多、部分欄位存取頻率差異大 |
本文著重水平分區實作。
OrderDate 為分區鍵,每年一個分區。ALTER DATABASE OrderDB ADD FILEGROUP [1999];
ALTER DATABASE OrderDB ADD FILE (
NAME = N'1999',
FILENAME = N'C:\OrderDB\1999.ndf',
SIZE = 5MB, MAXSIZE = 100MB, FILEGROWTH = 5MB
) TO FILEGROUP [1999];
-- 同理建立 2000, 2001, 2002 檔案群組
CREATE PARTITION FUNCTION FNOrderDateRange (datetime)
AS RANGE LEFT FOR VALUES ('19991231', '20001231', '20011231');
RANGE LEFT:邊界值屬於左側分區(≤ 1999/12/31 進第一區)。CREATE PARTITION SCHEME OrderDatePScheme
AS PARTITION FNOrderDateRange
TO ([1999], [2000], [2001], [2002]);
-- 移除既有叢集索引/主鍵
ALTER TABLE Orders DROP CONSTRAINT PK_Orders;
-- 在分區配置上重建叢集索引
CREATE UNIQUE CLUSTERED INDEX PK_Orders ON Orders(OrderDate)
ON OrderDatePScheme (OrderDate);
資料表即依 OrderDate 自動分散至四個檔案群組。
團隊開發時,缺乏一致的程式碼結構會導致後期除錯、效能調校如惡夢般困難。模板強制統一結構,並內建「審查」區塊利於 Code Review。
Template_StoredProcedure.txt:預存程序Template_View.txt:檢視表Template_Trigger.txt:觸發器Template_ScalarFunction.txt:純量函數Template_TableValuedFunction.txt:表值函數優化是種「心態」:相信效能問題可解決,結合經驗與最佳實踐,預防勝於治療。開發部署階段多投入一小時實施規範,日後可省下數百小時排錯時間。聰明工作,而非單純辛苦工作!