教你快速掌握两个SQL Server的维护技巧

作者:61901 时间:2009-01-15 13:31:00 

在工作中,作为一名开发者的你,也许偶尔需要从事维护数据库的工作。下面我们来介绍一下两个SQL服务器的维护技巧:轻松改变数据库拥有者、整理索引碎片。

在重指定数据库拥有者当回复或者新建数据库时,我们应当注意到SQL Server已经把把数据库的拥有者置为你的NT登录名,这样做是为了确保不同数据库间的一致性(更别提安全性因素了),你也许考虑用系统过程sp_changedbowner来把数据库拥有者改为其它用户如系统管理员(SA)。你也许已经写了这样一段脚本用来扫描所有用户数据库并把数据库拥有者重指定为系统管理员。  

系统过程sp_changedbowner有一个参数,即@map,其缺省值为空(null),该过程可以把数据库旧有的拥有者的别名重映射为新的数据库拥有者,如系统管理员。  

为了演示该过程,让我们首先建立一个尽可能小的数据库模型,然后运行sp_helpuser指令来看看新创建的用户名清单:

CREATE DATABASE luck  GO  USE luck  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
 
输出内容应该显示出系统管理员作为db_owner、ISUser1作为db_owner的别名。

现在我们用过程sp_changedbowner来指定ISUser2为数据库新的拥有者。我们将使用该过程的@map参数并把该参数赋值为“否”,这样把用户将为别名。

EXEC sp_changedbowner @loginame = 'ISUser2', @map = 'FALSE'

EXEC sp_helpuser  GO

输出应当显示出ISUser2现在成为数据库新的拥有者,ISUser1降为别名。下面,我们应该停止这个数据库并结束本演示过程。 

USE master  GO  DROP DATABASE luck  GO 

用DBCC INDEXDEFRAG命令来实现维护

对索引进行维护工作是一件冗长费力的工作,不过在SQL Server 2000中,微软已经引入了一条维护命令DBCC INDEXDEFRAG,它相对SQL Server7.0的DBREINDEX命令来说,有好几个优点。最主要的优点就是它是一种在线操作,这样,在该命令运行期间用户仍可以连续工作。这是因为它不像DBREINDEX那样在运行时需要锁定操作所涉及的资源,它还可以降低内容阻塞。  

DBCC INDEXDEFRAG操作一小段、一小段的数据,这样该操作随时都可以停止下来并跟踪它已经完成的工作。该操作每隔五分钟就报告一次估计已完成工作的百分比。  

从技术的角度来看,DBCC INDEXDEFRAG从新安排了目标索引所在的当前分配页上的物理叶。当操作完成后,目标索引的物理顺序与它的逻辑顺序相对应,因此可以加速索引的扫描速度。  

该操作还重新安排分配分配给目标索引的空间中的其它索引页。SQL Server将会为以一个填充因子为目标、根据索引数据的密度和为该索引分配的空间大小,来为索引缓冲页上的空间。操作后空下来的页将会被释放。  

注释:DBCC INDEXDEFRAG有几个缺点我们需要注意,如果一个表格中的两个索引共享一个盘区的同一个空间,而这两个索引并不相邻,那么最好重新建立索引让它们相邻。

假如索引中的碎片太多,那么DBCC INDEXDEFRAG命令执行的速度可能要低于 DBREINDEX命令;但是如果索引中的碎片不太多,那么DBCC INDEXDEFRAG 应该比DBREINDEX快的多,用DBCC INDEXDEFRAG取代DBREINDEX则会显现很多的优越性,此文中不再赘述。

标签:
0
投稿

猜你喜欢

  • python-OpenCV 实现将数组转换成灰度图和彩图

    2023-07-22 11:22:19
  • js特殊字符过滤的示例代码

    2023-09-07 21:53:30
  • python中DataFrame数据合并merge()和concat()方法详解

    2022-05-23 15:00:16
  • python+selenium+PhantomJS抓取网页动态加载内容

    2021-01-28 15:41:24
  • Python基于stuck实现scoket文件传输

    2023-06-06 22:59:50
  • CI操作cookie的方法分析(基于helper类库)

    2023-11-20 21:59:07
  • sqlserver bcp(数据导入导出工具)一般用法与命令详解

    2012-07-11 15:56:39
  • PHP使用CURL实现多线程抓取网页

    2024-06-05 09:48:25
  • 解决redis与Python交互取出来的是bytes类型的问题

    2021-04-26 20:54:08
  • MySQL 1130异常,无法远程登录解决方案详解

    2024-01-28 11:51:21
  • Python基于SMTP发送邮件的方法

    2021-07-17 23:42:46
  • Python 解决OPEN读文件报错 ,路径以及r的问题

    2022-06-12 11:06:41
  • JavaScript对象的创建模式与继承模式示例讲解

    2024-04-23 09:27:40
  • 详解如何在 Linux 中安装最新的 Python 3.6 版本

    2022-03-25 15:06:21
  • 用玩票的心态瞎猜豆瓣的思路

    2008-08-18 21:14:00
  • 通过 Django Pagination 实现简单分页功能

    2021-03-15 15:53:03
  • 基于mpvue的小程序项目搭建的步骤

    2024-05-13 09:12:13
  • 浅谈慢SQL优化之索引的作用

    2024-01-24 20:31:54
  • Django实现图片上传功能步骤解析

    2022-06-25 19:35:43
  • python实现给scatter设置颜色渐变条colorbar的方法

    2021-04-06 11:46:44
  • asp之家 网络编程 m.aspxhome.com