資料庫維護雖屬 DBA 職責,但開發人員掌握關鍵技巧能在緊急情況下迅速介入。本文介紹兩項實用技巧:使用 sp_changedbowner 統一資料庫擁有者,以及採用 DBCC INDEXDEFRAG 線上整理索引碎片。
還原或建立資料庫時,SQL Server 預設將擁有者設為目前的 NT 登入帳號。為確保跨環境一致性與安全性,建議統一改為 sa。
sp_changedbowner 的 @map 參數控制舊擁有者別名是否重新對應至新擁有者:
@map = 'TRUE'(預設):將舊擁有者的別名映射給新擁有者。@map = 'FALSE':保留舊別名,新擁有者不繼承別名權限。-- 建立測試資料庫
CREATE DATABASE OwnerTest;
GO
USE OwnerTest;
GO
-- 新增兩個登入並設為 dbo 別名
EXEC sp_addlogin 'UserA', 'Password1', 'master';
EXEC sp_addlogin 'UserB', 'Password2', 'master';
EXEC sp_addalias 'UserA', 'dbo';
-- 將擁有者改為 sa,並映射別名
EXEC sp_changedbowner 'sa', @map = 'TRUE';
EXEC sp_helpuser; -- 顯示 sa 為 dbo,UserA 為 dbo 別名
-- 改為 UserB 為擁有者,不映射別名
EXEC sp_changedbowner 'UserB', @map = 'FALSE';
EXEC sp_helpuser; -- UserB 成為 dbo,UserA 降為一般別名
-- 清理
USE master;
GO
DROP DATABASE OwnerTest;
GO
SQL Server 2000 引入 DBCC INDEXDEFRAG,較 DBCC DBREINDEX 具備線上操作、可中斷續傳、降低封鎖等優勢。
| 優點 | 缺點/限制 |
|---|---|
| 線上操作,不鎖定資源 | 共用區塊且不相鄰的索引建議重建 |
| 可中斷續傳,進度可見 | 碎片極高時比 DBREINDEX 慢 |
| 減少封鎖,釋放空間 | 非葉層索引頁不重排 |
不更新統計資料(需另行 UPDATE STATISTICS) |
定期監控 sys.dm_db_index_physical_stats(SQL 2005+)或 DBCC SHOWCONTIG,碎片率 10-30% 用 INDEXDEFRAG,超過 30% 改用 ALTER INDEX REBUILD(線上選項)或 DBREINDEX。維護窗口充足時,重建索引效果更徹底。