首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 維護實戰:輕鬆變更資料庫擁有者與整理索引碎片

     編輯:關於SqlServer

前言

資料庫維護通常由專業的 DBA 負責,但身為開發人員,有時也需要臨時處理維護工作。掌握幾個實用的 SQL Server 維護技巧,不僅能提升工作效率,甚至可能讓資深 DBA 都眼前一亮。本文將介紹兩個核心技巧:重新指定資料庫擁有者與使用 DBCC INDEXDEFRAG 整理索引碎片。

技巧一:重新指定資料庫擁有者

當您還原或建立新資料庫時,SQL Server 預設會將資料庫擁有者設為您的 NT 登入帳號。為了確保跨資料庫的一致性與安全性,建議統一將擁有者變更為系統管理員。這可以透過系統預存程序 sp_changedbowner 來完成。

關鍵參數:@map

sp_changedbowner 有一個重要參數 @map(預設為 NULL),它能控制舊擁有者的別名是否重新映射給新擁有者。以下透過實際範例示範:

實作步驟示範

-- 建立測試資料庫
CREATE DATABASE test;
GO
USE test;
GO
EXEC sp_helpuser;
GO

執行後會列出資料庫使用者,若使用 Windows 驗證,dbo 的登入名會顯示為 NULL。

-- 新增兩個登入帳號並設為 dbo 別名
EXEC sp_addlogin @loginame = 'ISUser1', @passwd = 'ISUser1', @defdb = 'master';
EXEC sp_addlogin @loginame = 'ISUser2', @passwd = 'ISUser2', @defdb = 'master';
EXEC sp_addalias @loginame = 'ISUser1', @name_in_db = 'dbo';

-- 將擁有者改為 sa,並啟用 @map 重新映射別名
EXEC sp_changedbowner @loginame = 'sa', @map = 'TRUE';
EXEC sp_helpuser;

此時 sa 成為 db_owner,ISUser1 成為其別名。

-- 再次變更擁有者為 ISUser2,但不映射別名(@map = FALSE)
EXEC sp_changedbowner @loginame = 'ISUser2', @map = 'FALSE';
EXEC sp_helpuser;
GO

結果顯示 ISUser2 成為新擁有者,ISUser1 降為一般別名。最後清理測試環境:

USE master;
GO
DROP DATABASE test;
GO

技巧二:使用 DBCC INDEXDEFRAG 線上整理索引碎片

索引維護向來耗時費力,SQL Server 2000 引入的 DBCC INDEXDEFRAG 相較於 SQL Server 7.0 的 DBREINDEX 擁有顯著優勢:

  • 線上操作:執行期間不鎖定資源,使用者可持續工作,大幅降低封鎖風險。
  • 增量式處理:以小批次處理資料,隨時可中斷並追蹤進度,每 5 分鐘回報完成百分比。
  • 物理順序優化:重新排列索引分頁的實體葉節點,使物理順序對應邏輯順序,加速掃描。
  • 空間回收:依填充因子重新分配頁面空間,釋放多餘頁面,讓索引更緊湊。

注意事項

若資料表中有兩個索引共用同一區段但不相鄰,建議改用重建索引使其相鄰,以獲得最佳效能。

總結

善用 sp_changedbowner 統一擁有者設定,搭配 DBCC INDEXDEFRAG 定期線上整理碎片,能讓資料庫維護更輕鬆、更安全、更高效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved