确实数据库的维护常常交给那些专业的数据库管理员但是作为一个开发者你也许偶尔需要暂时从事这个工作所以试一试这两个SQL服务器维护技巧轻松改变数据库拥有者整理索引碎片谁会想到你甚至可以给那些数据库管理员教上一两个新技巧呢?重指定数据库拥有者
当回复或者新建数据库时你有没有注意到SQL Server把数据库的拥有者置为你的NT登录名?仅仅为了确保不同数据库间的一致性(更别提安全性因素了)你也许考虑用系统过程sp_changedbowner来把数据库拥有者改为其它用户如系统管理员(SA)你也许已经写了这样一段脚本用来扫描所有用户数据库并把数据库拥有者重指定为系统管理员
系统过程sp_changedbowner有一个参数即@map其缺省值为空(null)该过程可以把数据库旧有的拥有者的别名重映射为新的数据库拥有者如系统管理员
为了演示该过程让我们首先建立一个尽可能小的数据库模型然后运行sp_helpuser指令来看看新创建的用户名清单
CREATE DATABASE test
GO
USE test
GO
EXEC sp_helpuser
GO
这些代码执行后输出应该列出数据库拥有者的清单(db_owner)如果你使用Windows NT认证身份那么清单中应该有一个NULL的登录名字和一个SID值
然后让我们加上两个登录用户ISUser和ISUser作为db_owner的别名并把数据库的拥有者改为系统管理员
EXEC sp_addlogin @loginame = ISUser @passwd = ISUser@defdb = master
EXEC sp_addlogin @loginame = ISUser @passwd = ISUser@defdb = master
EXEC sp_addalias @loginame = ISUser @name_in_db = dbo
EXEC sp_changedbowner @loginame = sa @map = TRUE
EXEC sp_helpuser
输出内容应该显示出系统管理员作为db_ownerISUser作为db_owner的别名
现在我们用过程sp_changedbowner来指定ISUser为数据库新的拥有者我们将使用该过程的@map参数并把该参数赋值为否这样把用户将为别名
EXEC sp_changedbowner @loginame = ISUser @map = FALSE
EXEC sp_helpuser
GO
输出应该显示出ISUser现在成为数据库新的拥有者ISUser降为别名下面我们应该停止这个数据库并结束本演示过程
USE master
GO
DROP DATABASE test
GO
用DBCC INDEXDEFRAG命令来实现维护
对索引进行维护工作是一件冗长费力的工作不过在SQL Server 中微软已经引入了一条维护命令DBCC INDEXDEFRAG它相对SQL Server的DBREINDEX命令来说有好几个优点最主要的优点就是它是一种在线操作这样在该命令运行期间用户仍可以连续工作这是因为它不像DBREINDEX那样在运行时需要锁定操作所涉及的资源它还可以降低内容阻塞
DBCC INDEXDEFRAG操作一小段一小段的数据这样该操作随时都可以停止下来并跟蹤它已经完成的工作该操作每隔五分钟就报告一次估计已完成工作的百分比
从技术的角度来看DBCC INDEXDEFRAG从新安排了目标索引所在的当前分配页上的物理叶当操作完成后目标索引的物理顺序与它的逻辑顺序相对应因此可以加速索引的扫描速度
该操作还重新安排分配分配给目标索引的空间中的其它索引页SQL Server将会为以一个填充因子为目标根据索引数据的密度和为该索引分配的空间大小来为索引缓沖页上的空间操作后空下来的页将会被释放这就使得索引变得更加紧凑
DBCC INDEXDEFRAG也有几个缺点需要你注意
如果一个表格中的两个索引共享一个盘区的同一个空间而这两个索引并不相邻那么最好重新建立索引让它们相邻
如果索引中的碎片太多那么DBCC INDEXDEFRAG命令执行的速度可能要低于 DBREINDEX命令但是如果索引中的碎片不太多那么DBCC INDEXDEFRAG 应该比DBREINDEX快的多用DBCC INDEXDEFRAG取代DBREINDEX的好处网上有介绍
非叶式(nonleaf)索引页不能重新排序
DBCC INDEXDEFRAG不能更新统计数字