两个SQL Server维护技巧

确实,数据库的维护常常交给那些专业的数据库管理员,但是作为一个开发者,你也许偶尔需要暂时从事这个工作。所以,试一试这两个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

输出内容应该显示出系统管理员作为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 test
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的好处网上有介绍。
非叶式(nonleaf)索引页不能重新排序。
DBCC INDEXDEFRAG不能更新统计数字。

时间: 2024-10-28 11:09:27

两个SQL Server维护技巧的相关文章

SQL Server维护技巧两则

确实,数据库的维护常常交给那些专业的数据库管理员,但是作为一个开发者,你也许偶尔需要暂时从事这个工作.所以,试一试这两个SQL服务器维护技巧:轻松改变数据库拥有者.整理索引碎片.谁会想到你甚至可以给那些数据库管理员教上一两个新技巧呢? 重指定数据库拥有者 当回复或者新建数据库时,你有没有注意到SQL Server把数据库的拥有者置为你的NT登录名?仅仅为了确保不同数据库间的一致性(更别提安全性因素了),你也许考虑用系统过程sp_changedbowner来把数据库拥有者改为其它用户如系统管理员(

SQL Server优化技巧之SQL Server中的"MapReduce"

原文:SQL Server优化技巧之SQL Server中的"MapReduce" 日常的OLTP环境中,有时会涉及到一些统计方面的SQL语句,这些语句可能消耗巨大,进而影响整体运行环境,这里我为大家介绍如何利用SQL Server中的"类MapReduce"方式,在特定的统计情形中不牺牲响应速度的情形下减少资源消耗. 我们可能经常会利用开窗函数对巨大的数据集进行分组统计排序.比如下面的例子: 脚本环境 /* This script creates two new

两台Sql server数据同步

server|数据|数据同步 复制的概念 复制是将一组数据从一个数据源拷贝到多个数据源的技术,是将一份数据发布到多个存储站点上的有效方式.使用复制技术,用户可以将一份数据发布到多台服务器上,从而使不同的服务器用户都可以在权限的许可的范围内共享这份数据.复制技术可以确保分布在不同地点的数据自动同步更新,从而保证数据的一致性. SQL复制的基本元素包括 出版服务器.订阅服务器.分发服务器.出版物.文章 SQL复制的工作原理 SQL SERVER 主要采用出版物.订阅的方式来处理复制.源数据所在的服务

两台SQL Server数据同步解决方案

server|解决|数据|数据同步 复制的概念 复制是将一组数据从一个数据源拷贝到多个数据源的技术,是将一份数据发布到多个存储站点上的有效方式.使用复制技术,用户可以将一份数据发布到多台服务器上,从而使不同的服务器用户都可以在权限的许可的范围内共享这份数据.复制技术可以确保分布在不同地点的数据自动同步更新,从而保证数据的一致性. SQL复制的基本元素包括 出版服务器.订阅服务器.分发服务器.出版物.文章 SQL复制的工作原理 SQL SERVER 主要采用出版物.订阅的方式来处理复制.源数据所在

两个SQL SERVER的概念

server|概念         页是SQL SERVER 最基本的数据存储单元,在SQL SERVER 中,每页共有8KB,也就是说SQL SERVER数据库每兆数据文件共可以容纳128页.         页的类型:数据.索引.文本/图像.全局数据分布.页自由空间.索引分布映像.         范围(extent)是SQL SERVER 数据库分配给表或索引的存储空间的最基本单位.每个范围包括8个连续的页.即SQL SERVER 数据文件每兆字节最多可以容纳16个范围.不过,为了提高使用

同步两个Sql server

如何同步两个SQLServer数据库的内容? 程序代码可以有版本管理CVS进行同步管理,可是数据库同步就非常麻烦,只能自己改了一个后再去改另一个,如果忘记了更改另一个经常造成两个数据库的结构或内容上不一致.各位有什么好的方法吗? 分发与复制 用强制订阅实现数据库同步操作 大量和批量的数据可以用数据库的同步机制处理: // 说明: 为方便操作,所有操作均在发布服务器(分发服务器)上操作,并使用推模式 在客户机器使用强制订阅方式. 有疑问联系作者:zlp321001@hotmail.com 测试通过

SQL Server 工作技巧

  1. isnull();函数 在SQL Server 中经常会遇到一些字段为空值,这里可以使用isnull()这个函数来做判断;eg: select isnull(Table_column,'Test') as column from Table 这个语句意思就是:从Table表中取字段Table_column,如果该字段值为空,则用"Test"字符来代替; 2.sysobject SQL Server中有一个系统对象表 sysobject 这个表里存储了数据库中所有的对象,比如约

Sample script that deletes a SQL Server database_javascript技巧

Sample script that deletes a SQL Server database. Supported Platforms SQL Server 2000  Yes Script Code 复制代码 代码如下: strDBServerName = "."  strDBToDelete       = "ScriptingGuysTestDB"  Set objSQLServer = CreateObject("SQLDMO.SQLServe

Sample script that displays all of the users in a given SQL Server DB_javascript技巧

Sample script that displays all of the users in a given SQL Server DB. Supported Platforms SQL Server 2000  Yes Script Code 复制代码 代码如下: strDBServerName = "."  strDBName = "ScriptingGuysTestDB"  Set objSQLServer = CreateObject("SQLD