确实,数据库的维护常常交给那些专业的数据库管理员,但是作为一个开发者,你也许偶尔需要暂时从事这个工作。所以,试一试这两个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值。
然后,让我们加上两个登录用户:ISUser1和ISUser2作为db_owner的别名,并把数据库的拥有者改为系统管理员:
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'
EXEC sp_changedbowner @loginame = 'sa',@map = 'TRUE'
EXEC sp_helpuser
EXEC sp_changedbowner @loginame = 'ISUser2',
@map = 'FALSE' EXEC sp_helpuser GO
USE master GO DROP DATABASE test GO
DBCC INDEXDEFRAG操作一小段、一小段的数据,这样该操作随时都可以停止下来并跟踪它已经完成的工作。该操作每隔五分钟就报告一次估计已完成工作的百分比。
从技术的角度来看,DBCC INDEXDEFRAG从新安排了目标索引所在的当前分配页上的物理叶。当操作完成后,目标索引的物理顺序与它的逻辑顺序相对应,因此可以加速索引的扫描速度。
该操作还重新安排分配分配给目标索引的空间中的其它索引页。SQL Server将会为以一个填充因子为目标、根据索引数据的密度和为该索引分配的空间大小,来为索引缓冲页上的空间。操作后空下来的页将会被释放,这就使得索引变得更加紧凑。
DBCC INDEXDEFRAG也有几个缺点需要你注意:
如果一个表格中的两个索引共享一个盘区的同一个空间,而这两个索引并不相邻,那么最好重新建立索引让它们相邻。
如果索引中的碎片太多,那么DBCC INDEXDEFRAG命令执行的速度可能要低于 DBREINDEX命令;但是如果索引中的碎片不太多,那么DBCC INDEXDEFRAG 应该比DBREINDEX快的多,用DBCC INDEXDEFRAG取代DBREINDEX的好处网上有介绍。
非叶式(nonleaf)索引页不能重新排序。
DBCC INDEXDEFRAG不能更新统计数字。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。