配色: 字号:
SQL Server十大热门技巧
2012-03-20 | 阅:  转:  |  分享 
  


















专家汇总:

SQLServer十大热门技巧



专家汇总:SQLServer十大热门技巧





本专题是专家对目前SQLServer最热门和实用的十大技巧进行的总结。定义各种数

据类型、配置内存设置或有关SQLServer表和日志问题的解决等等都是目前人们最关注

的话题、也是作为数据库管理员、开发员必须了解的话题。



10、设计SQLServer集簇索引以提升性能



SQLServer的集簇索引是数据库整体架构的一个非常重要的方面。它们经常被忽视、

误解,或者如果数据库很小,它们会被认为是不重要的。在本文中作者将主要说明SQL

Server集簇索引是如何存储在硬盘中的,为什么它们应该一直随着时间增加以及为什么静

态的集簇索引是最好的。我同时也将探讨多对多表,为什么它们会被使用,以及集簇索引

如何能够让这些表效率更高。



?设计SQLServer集簇索引以提升性能(一)

?设计SQLServer集簇索引以提升性能(二)



9、SQLServer2005的XML数据类型和

VARCHAR(MAX)



在SQLServer2005中选择XML数据类型或VARCHAR(MAX)数据类型时,数据库管理

员和开发员应该知道它们的个子对性能的影响。在本文中,我将向你介绍一个例子,它使

用了两个表,一个用于插入和查询XML数据,而另一个使用VARCHAR(MAX)数据类型,从而

为你的SQLServer环境作出最佳选择。



?SQLServer2005的XML数据类型和VARCHAR(MAX)之一

?SQLServer2005的XML数据类型和VARCHAR(MAX)之二





TT数据库技术专题之“SQLServer十大热门技巧”Page2of92



8、如何创建与DB2链接的SQLServer服务器





许多SQLServer环境运行着DB2服务器,并且两个服务器之间必须进行连接。本文

将为你逐步讲解创建SQLServer链接服务器的步骤,以帮助解决SQLServerDBA和DB2

DBA之间的语言鸿沟。



?如何创建与DB2链接的SQLServer服务器(一)

?如何创建与DB2链接的SQLServer服务器(二)



7、SQLServer数据库设计灾难:不该做什么





如果一个外人仔细地查看你的SQLServer数据设计时,你会感觉到窘迫吗?有没有

可能在你的表中实现一个外键约束呢?你是否在字段中使用了正确的数据类型?你是否按

规范定义的方式进行表/字段命名?数据库体系架构师BrianWalker根据他多年的SQL

Server经验,提出了许多用于改进数据库设计和SQLServer性能的建议……



?SQLServer数据库设计灾难:不该做什么



6、用存储过程查询SQLServer表和其它对象大小





在对象决定SQLServer磁盘空间时,微软sp_spaceused就有限制。本文中原始的存

储程序,sp_spaceused,就是用来计算SQLServer中特定的对象空间。我们可以用它来

查看数据库的用户表大小概况、计算一组表所占用的空间总大小以及查看前10个最大的

索引对象。





TT数据库技术专题之“SQLServer十大热门技巧”Page3of92



?用存储过程查询SQLServer表和其它对象大小



5、如何使用向导设置SQLServer2005日志传送





在SQLServer2005中建立日志传送时,你可以用许多种方法来实现主服务器和副服

务器之间的最优配置。除了一些最佳实践方法之外,我们还要从头到尾遵循SQLServer

MVPHilaryCotter日志传送安装过程,其中包括选择合适的数据库恢复模式、事务日志

路径和副数据库设置……



?如何使用向导设置SQLServer2005日志传送(一)

?如何使用向导设置SQLServer2005日志传送(二)

?如何使用向导设置SQLServer2005日志传送(三)



4、用存储过程检查SQLServer数据库和日志文件大小





解SQLServer数据库的大小是许多DBA的职责之一,而这个职责你可以轻松通过存

储过程sp_SDS来完成。sp_SDS不仅能确定“SQL数据库空间”,而且它还能监测数据库

的增长,提醒DBA关于数据或日志文件的增长,执行事务日志备份,甚至提供详细的文件

级明细表,这样DBA可以压缩文件以获取最大空余空间。本文介绍了完整的sp_SDS及其

算法。本文还将进一步阐述如何查询数据库对象的大小,包括SQLServer表。



?用存储过程检查SQLServer数据库和日志文件大小(一)

?用存储过程检查SQLServer数据库和日志文件大小(二)

?用存储过程检查SQLServer数据库和日志文件大小(三)





TT数据库技术专题之“SQLServer十大热门技巧”Page4of92



3、SQLServer2005的DATETIME和SMALLDATETIME基础





理解SQLServer的日期/时间数据类型是有一定难度的,尤其是混合使用TIMESTAMP

的时候。在本篇技巧中,你将了解到关于数据是如何存储在DATETIME和SMALLDATETIME

的基础知识,以及大致地了解TIMESTAMP数据类型——它经常与两种主要的日期/时间数

据类型相混淆。



?SQLServer2005的DATETIME和SMALLDATETIME基础(一)

?SQLServer2005的DATETIME和SMALLDATETIME基础(二)

?SQLServer2005的DATETIME和SMALLDATETIME基础(三)



2、配置SQLServer内存设置



SQLServer中有一些十分重要的内存设置。本篇技巧中,SQLServer专家Denny

Cherry将告诉我们SQLServer最适合的RAM总数、如何进行AWE内存管理、最大服务器

内存设置以及32位和64位平台之间的区别。



?配置SQLServer内存设置(一)

?配置SQLServer内存设置(二)



1、SQLServer中日期/时间值到字符类型的数据转换





Transat-SQL支持的两种内置日期/时间数据和字符数据数据之间的转换方法。在

2008年最关注的10大技巧中,SQLServer专家RobertSheldon将向你逐步介绍每种方

法的过程和步骤——隐式转换和显式转换。这些步骤包括用手动CAST和CONVERT函数转

换日期/时间值。



TT数据库技术专题之“SQLServer十大热门技巧”Page5of92





?SQLServer中日期/时间值到字符类型的数据转换(一)

?SQLServer中日期/时间值到字符类型的数据转换(二)













TT数据库技术专题之“SQLServer十大热门技巧”Page6of92





设计SQLServer集簇索引以提升性能(一)



SQLServer的集簇索引是数据库整体架构的一个非常重要的方面。它们经常被忽视、

误解,或者如果数据库很小,它们会被认为是不重要的。

本文阐述了集簇索引对于整个系统性能以及数据库增大时维护的重要性。我将主要说

明SQLServer集簇索引是如何存储在硬盘中的,为什么它们应该一直随着时间增加以及

为什么静态的集簇索引是最好的。我同时也将探讨多对多表,为什么它们会被使用,以及

集簇索引如何能够让这些表效率更高。

最后,很重要的是我们会讨论新的SQLServer2005分割表概念,并探讨分割表是如

何影响集簇索引的。这将有助于你以后作为出正确的决定性。

集簇索引默认是与匹配主键相匹配的,而主键是定义在SQLServer表上的。然而,

你可以在任何字段上创建一个集簇索引,然后在另一个字段或多个字段上定义一个主键。

这时,这个主键将会作为一个唯一的非集簇索引被创建。典型地,一个集簇索引会与主键

相匹配,但这并不是必须的,所以要仔细考虑。对于各种可能出现的情况,我将讨论集簇

索引本身,而不管你是否选择将它与主键相匹配。

集簇索引实际上装载了SQLServer的数据记录行,所以你的集簇索引存储的地方就

是你的数据存储的地方。集簇索引是按数据范围而组织的。比如,1到10之间的值存储为

一个范围,而90到110是另一个范围。因为集簇索引是按范围存储的,如果你需要在一

个范围中搜索一个审计日志,使用基于日期字段的集簇索引效率会更高,其中日期字段会

用于返回日期范围。非集簇索引更适用于具体值的搜索,比如“等于DateValue的日

期”,而不是范围搜索,比如“在date1和date2之间的日期”。

集簇索引的不断增加值



TT数据库技术专题之“SQLServer十大热门技巧”Page7of92



集簇索引必须是基于值不断增加的字段。在前面的例子中,我使用了审计日志的日期

字段,审计日志的日期值是不断增加的,而且旧的日期将不会再插入到数据表中。这就是

一个“不断增加”字段。另一个不断增加值的好例子就是标识字段,它也是从创建后就持

续恒定增加的。

为什么我在这里花这么多时间讨论集簇索引的不断增加值呢?这是因为集簇索引的最

重要的属性就是它们是不断增加的并且本质上是静止的。不断增加之所以重要的原因与我

之前提到的范围架构有关。如果值不是不断增加的,SQLServer就必须在现有记录的范围

内分配位置,而不是直接将它们放到索引后面的新的范围中。

如果值不是不断增加的,那么当范围的值用完后再出现一个已经用索引范围的值时,

SQLServer将做一个页拆分插入一个索引。在实现时,SQLServer会将已填满的页拆分

成两个单独的页,这两个页此时会有更多的值空间,但这需要更多的资源去处理。你可以

通过设置填充参数为70%来作好预备工作,这样就可以有30%的自由空间来为后来的值使

用。

这个方法的问题是你必须不断地“再索引”集簇索引使它能维持30%的自由空间。对

集簇索引进行再索引会带来繁重的I/O负载,因为它必须移动它的实际数据,并且任何非

集簇索引都必须重建,这会增加许多的维护时间。

如果集簇索引是不断增加的,你将不需要重建集簇索引。你可以将集簇索引的填充因

数设置为100%,这样随着时间的推移,你就只需要对于不集中的、非集簇索引进行再索

引,这样就可以增加数据库在线时间。

不断增加的值将只会在索引的尾部添加新值,并且只在需要的时候才创建新的索引范

围。由于新的值都只会不断地添加到索引的尾部而且填充因数为100%,所以将不再会有逻

辑碎片出现。填充因数越高,每一页所填充的记录行就越多。更高的填充因数使得查询时

会需要更少的I/O、RAM和CPU资源。你查询集簇索引中越少的数据类型,JOIN/查询操作

速度会更快。同时,因为每一个非集簇索引都要求包括集簇索引键,所以集簇索引键和非

集簇索引也会更小。



TT数据库技术专题之“SQLServer十大热门技巧”Page8of92



集簇索引的最佳数据类型是非常狭窄的。对于数据类型大小,它通常是smallint、

int、bigint或datetime。当datetime值用作集簇索引时,它们是唯一的字段并且通常

是不断增加的日期值,这些值通常是作为范围数据查询的。通常,你应该避免组合(多字

段)集簇索引,除了以下情况:多对多数据表和SQLServer2005分割表,这种分割表有

分割的字段,它包含了集簇索引而允许索引排列。

(作者:MatthewSchroeder译者:陈柳/曾少宁来源:TT中国)



TT数据库技术专题之“SQLServer十大热门技巧”Page9of92





设计SQLServer集簇索引以提升性能(二)



多对多表和集簇索引

多对多表有非常快速的JOIN并允许快速的从一个记录到另一个记录的重新联合。设

想有下面这样的数据结构:

Customer

CustomerID(bigintidentity)NameFieldn+

CustomerOrder

CustomerIDOrderID

Orders

OrderID(bigintidentity)DateFieldn+

这些结构中的集簇索引是CustomerID和OrderID。组合键是CustomerID/OrderID。

下面这个结构的优点:

JOIN都是基于集簇索引(比非集簇索引JOIN快很多)。

将一个Order赋给另一个Customer只需要对CustomerOrder表作一个UPDATE操作,

这是改动非常少的,只影响到一个集簇索引。因此,它减少了你在更新一个大表时的数据

库锁的时间,如Orders表。



TT数据库技术专题之“SQLServer十大热门技巧”Page10of92



使用多对多表就不需要大表中的一些非集簇索引,如Customer/Orders。因此,它减

少大表的维护时间。

这个方法的一个缺点是CustomerOrder表的碎片(不是连续的)。然而,这并不是一

个大问题,因为这个表是相对较小的,它只有2个字段,数据类型也很少,并且只有一个

集簇索引。这些本来是在包括CustomerID的Orders表的非集簇索引的减少,带来的好处

是大于额外开销的。

SQLServer2005的集簇索引和分割表

SQLServer2005中的分割表是一些表面上为一个独立的表,但实际上——在存储子

系统中——它们包含能够存储在许多文件组(Filegroup)的多个部分。表的部分是根据

一个字段的值来分割成不同文件组的。这种方式的分割表会有几个缺点。这里我会说明几

个基本的缺点,希望能让你对相关的原因有一些了解。我建议你使用分割表时先学习它的

使用方法。

你可以在这个环境中基于一个字段创建一个集簇索引。但是,如果这个字段不是表用

于分割的那个字段,那么集簇索引就被称为非对齐的。如果一个集簇索引是非对齐的,那

么任何分区的数据进/出(或合并)都需要你删除集簇索引以及非集簇索引,然后再重建

这些索引。这是必要的,因为SQLServer并不知道集簇/非集簇索引的哪部分属于哪个表

的分区。毫无疑问,这会带来一定的系统停机时间。

分割表上的集簇索引应该总包含常规的集簇字段,它是不断增加和静态的,并且它是

用于分割数据库表的。如果集簇索引包含用于分割表的字段,那么SQLServer就知道集

簇/非集簇索引的哪个部分属于哪个分区。当一个集簇索引包含了用于分割表的字段时,

那么这个集簇索引就是“对齐的”。这时表的分区就可以在数据进/出(和合并)而不需

要重建集簇/非集簇索引,这样就不会带来额外的系统停机时间。表的

INSERT/UPDATE/DELETE操作也会更快,因为这些操作只需要关注处于它们自己分区的索

引。



TT数据库技术专题之“SQLServer十大热门技巧”Page11of92



总结

SQLServer集簇索引是数据体系结构的一个重要部分,我希望你已经从本文学习中知

道了为什么你需要在一开始就仔细设计好集簇索引。集簇索引应该是窄小的、静态的和不

断增加的,这对于将来数据库的健壮性是非常重要的。集簇索引可能帮你实现更快速的

JOIN和IUD操作,并最小化系统的忙时拥塞时间。

最后,我们讨论了SQLServer2005的分割表是如何影响你对集簇索引的使用,集簇

索引与分区的“对齐”的意思是什么,以及为什么集簇索引必须按顺序对齐以使分割表正

常工作。请继续关注关于将在二月发表的文章《非集簇索引》(第二部分)和三月发表的

文章《最优索引维护》(第三部分)。

(作者:MatthewSchroeder译者:陈柳/曾少宁来源:TT中国)





TT数据库技术专题之“SQLServer十大热门技巧”Page12of92





SQLServer2005的XML数据类型和VARCHAR(MAX)之一



作为一个数据库管理员,我试着仔细分析性能问题以及如何保证使用XML时不要影响

SQLServer性能。在本文中,我将向你介绍一个例子,它使用了两个表,一个用于插入和

查询XML数据,而另一个使用VARCHAR(MAX)数据类型。然后我们观察存储、CPU和I/O的

测试结果,从而为你的SQLServer环境作出最佳选择。

注意:这里使用的测试仅仅针对基本的表,不使用索引。

如果你对于在SQLServer使用T-SQL命令和XMLAUTO的应用性能比较有兴趣,请阅

读我的上一篇技巧文章。

XML数据类型

XML数据类型会由SQLServer在进行检查时与VARCHAR(MAX)比较,以保证它的内容

是合法的XML。

测试环境描述

对于我的测试,我将使用从一个.rdl文件(ReportingServicesReport)拷贝的

XML,大小为265KB。我将创建两个有相同结构的表,只是其中的MyXML域,一个表使用

XML数据类型,而另一个表使用VARCHAR(MAX)数据类型。


idintidentitynotnull,

MyXMLVARCHAR(MAX)null

)Go

createtableTryXMLDatatype(



TT数据库技术专题之“SQLServer十大热门技巧”Page13of92



idintidentitynotnull,

MyXMLXMLnull

)Go

我将用相同的方法向每一个表插入XML数据:



setstatisticsioon

Go

declare@XMLXML

--

MybigXML(forspacereasonsIamnotincludingallofithere)SET@XML=''

<?xmlversion="1.0"encoding="utf-8"?>

………

''

insertintoTryXMLDatatype(MyXML)values(@XML)

go

declare@VarchVARCHAR(MAX)

--MybigXML(forspacereasonsIamnotincludingallofithere)

SET@Varch=''<?xmlversion="1.0"encoding="utf-8"?>

………

''

insertintoTryXMLDatatype(MyXML)values(@Varch)

Go

插入XML数据到表中

我在SQLProfiler中监控上面的插入命令,并得到I/O统计,运行两次。



TT数据库技术专题之“SQLServer十大热门技巧”Page14of92



I/O统计结果:

TryXMLDatatype表。扫描次数:0,逻辑读取次数:1,物理读取次数:0,预读次

数:0,慢速逻辑读取次数:18,慢速物理读取次数:0,慢速预读次数:0。

TryVACRCHARDatatype表。扫描次数:0,逻辑读取次数:1,物理读取次数:0,预读

次数:0,慢速逻辑读取次数:90,慢速物理读取次数:0,慢速预读次数:0。

执行计划显示了两个命令的精确计划。

Profiler结果(每一个插入的两次执行):



注意:XML插入占用更多的CPU而读/写则比较少。同时插入XML数据需要时间更长。

我将在下一部分分析这个行为。

查询表



IranSELECTFROMineachtableandmonitoredwithProfilerandStatisticsI

/O:

SELECTFROMTryXMLDatatype

Go

SELECTFROMTryVACRCHARDatatype

Go

结果:



TT数据库技术专题之“SQLServer十大热门技巧”Page15of92





注意:域中的值是不同的!

I/O统计结果:

TryXMLDatatype表:扫描次数:0,逻辑读取次数:1,物理读取次数:0,预读次

数:0,慢速逻辑读取次数:56,慢速物理读取次数:0,慢速预读次数:0。

TryVACRCHARDatatype表:扫描次数:0,逻辑读取次数:1,物理读取次数:0,预读

次数:0,慢速逻辑读取次数:200,慢速物理读取次数:0,慢速预读次数:0。

XML数据类型占用更少的I/O。、

同样,执行计划成本显示了两个命令的完全相同的计划。



为什么两个表的读取操作差别这么大呢?

注意:查询XML的时间更长。时间延长的很多不同的因素是基于机器的活动。我将忽

略这些不同点,主要是因为没有CPU显示。如果涉及到CPU活动,它可能解释了时间延长

的不同点但是这并不是重点。



TT数据库技术专题之“SQLServer十大热门技巧”Page16of92



让我查询一下每一个表的字段长度:



SELECTdatalength(MyXML)FROMTryXMLDatatype

Go

SELECTdatalength(MyXML)FROMTryVACRCHARDatatype

Go

很意外,XML域的字符比另一个更少。原因如下:

XML--lessI/O:

当插入XML数据类型时,“附加”数据,如引号和制表符会从域中删除。结果是更加

节约了存储空间。

我尝试从XML字段拷贝值到VARCHAR(MAX)字段,如下:



truncatetableTryVARCHARDatatype

Go

insertintoTryVARCHARDatatype(MyXML)

selectconvert(varchar(max),MyXML)fromTryXMLDatatype

Go



(作者:MichelleGutzait译者:曾少宁/陈柳来源:TT中国)



TT数据库技术专题之“SQLServer十大热门技巧”Page17of92





SQLServer2005的XML数据类型和VARCHAR(MAX)之一



结果:



看起来是一样的,但是……



SELECTdatalength(MyXML)FROMTryXMLDatatype

Go

SELECTdatalength(MyXML)FROMTryVACRCHARDatatype

Go



这比前面好一些(现在是136,268,而不是271,210),但情况仍然相同。如果我

将XML转化到VARCHAR(MAX)然后计算长度:



TT数据库技术专题之“SQLServer十大热门技巧”Page18of92





SELECT

datalength(convert(varchar(max),MyXML))FROMTryXMLDatatype

go

SELECTdatalength(MyXML)FROMTryVARCHARDatatype

Go



长度相同。

这意味着XML数据类型的存储方式更加高效。现在两个表包括了相同的数据,让我们

再看看Profiler的跟踪命令selectfrombothtables(threeexecutions)的结果:



XML数据类型的读取数少了20%。

I/O统计:

TryXMLDatatype表:扫描次数:0,逻辑读取次数:1,物理读取次数:0,预读次

数:0,慢速逻辑读取次数:56,慢速物理读取次数:0,慢速预读次数:0。



TT数据库技术专题之“SQLServer十大热门技巧”Page19of92



TryVARCHARDatatype表:扫描次数:0,逻辑读取次数:1,物理读取次数:0,预读

次数:0,慢速逻辑读取次数:100,慢速物理读取次数:0,慢速预读次数:0。

同样,这里XML数据类型的读操作也效率更高。

查询到XML转换为VARCHAR(MAX)是怎样的呢?



SELECTconvert(varchar(max),MyXML)FROMTryXMLDatatype

Go

SELECTMyXMLFROMTryVARCHARDatatype

Go



TryXMLDatatype表:扫描次数:1,逻辑读取次数:1,物理读取次数:0,预读次

数:0,慢速逻辑读取次数:20,慢速物理读取次数:0,慢速预读次数:9。

TryVARCHARDatatype表:扫描次数:1,逻辑读取次数:1,物理读取次数:0,预读

次数:0,慢速逻辑读取次数:100,慢速物理读取次数:0,慢速预读次数:0。

对于不变行为的唯一度量标准是I/O读取。而且,XML转换查询还会使用CPU资源来

实现转换——这很正常。

结论



TT数据库技术专题之“SQLServer十大热门技巧”Page20of92



XML数据类型表示存储纯XML数据,它不包括不必要的头尾字符。这带来的结果是通

过I/O方法实现更划算的存储方式,然而这里仍然有一些CPU资源用于验证XML是有否

效。

(作者:MichelleGutzait译者:陈柳/曾少宁来源:TT中国)



TT数据库技术专题之“SQLServer十大热门技巧”Page21of92





如何创建与DB2链接的SQLServer服务器(一)



许多SQLServer环境都运行着必须链接到SQLServer的DB2服务器。链接到一个

DB2服务器是有挑战性的,因为你必然首先从使用不同术语的DB2工程师中得到数值,然

后使用那些不熟悉的数值来链接处理。本文将为你逐步讲解创建SQLServer链接服务器

的步骤,以帮助解决SQLServerDBA和DB2DBA之间的语言鸿沟。

安装DB2驱动

因为我们所探讨的是Microsoft的产品,所以我们将使用Microsoft自己的DB2驱动

程序来演示这个技术。Microsoft的DB2驱动程序是来自于SQLServer2005(或2000)

的特性包,因此它需要在任一与DB2通信的服务器上分别下载和安装。

链接服务器对话

一旦安装了驱动程序,你就可以尝试创建链接服务器,同时可以看到下面的屏幕:



TT数据库技术专题之“SQLServer十大热门技巧”Page22of92





图A:使用OLEDB驱动程序创建链接服务器

Microsoft并没有提供太多的提示让我们决定应该在这个表单中填写什么样的供应商

属性和其它设置。如果你查看的是一个安装了DB2驱动的服务器,上面会有一个名为

“MicrosoftOLEDBProviderforDB2”的程序,该程序有一个“DataAccessTool”

链接。基本上,“DataAccessTool”可以帮你完成链接服务器选项中的供应商字符设

置。打开“DataAccessTool”,然后我们将探讨如何为DB2的链接服务器设置各种选

项。

步骤1:

右击DB2OLEDBUDL,然后选择“NewDataSource”。



TT数据库技术专题之“SQLServer十大热门技巧”Page23of92





图B:在DataAccessTool中选择“NewDataSource”。

步骤2

选择平台。因为DB2有许多支持的平台,你需要与你的DB2管理员讨论以找出运行平

台。在这个例子中,我们将使用AS400DB2版本。



TT数据库技术专题之“SQLServer十大热门技巧”Page24of92





图C:选择AS400DB2平台创建你的链接服务器。

步骤3

输入服务器地址。这里最好不要使用IP地址,因为它是会随服务器角色变化而改变

(相当于集群回滚的SQLServer)。而DNS条目是最佳选择,这里我们将使用

AS400.CYPHER.NET作为默认端口。你的环境可能有一个自定义的端口——请向你的DB2管

理员找到该端口。



TT数据库技术专题之“SQLServer十大热门技巧”Page25of92





图D:输入服务器地址AS400.CYPHER.NET。

步骤4

下面(图E)是输入一系列必要的连接信息的对话框。InitialCatalog选项是很重

要的;这是DB2的RDB名称。一般来说它是初始创建的服务器名,但它也可能是你的DB2

DBA所定义的别名。所有其他的选项一般都设为相同的值,该值同时也是你将要尝试访问

的库(Library)。DB2的库可以粗略地看作是SQLServer的数据库。



TT数据库技术专题之“SQLServer十大热门技巧”Page26of92





图E:输入大多数链接服务器连接信息的截图

步骤5

在下一个对话框(图F),你可以设置转换的字符集。AS400使用EBCDIC字符集,也

就是我们主机的CCSID值。(你可以询问你的DB2DBA找到他们系统使用的CCSID)。PC

代码页是当前Windows服务器上使用的代码页。典型地,它会设为ANSI——US会使用

Latin1,但你可以根据你所使用的语言来定制使用其它的Windows代码页。

一般“Processbinaryascharacter”应该置空,这样二进制值才可以作为二进制

处理。但有些目标系统会将它转化为字符,这样你也可以传递二进制值。



TT数据库技术专题之“SQLServer十大热门技巧”Page27of92





图F:在大多数环境中,不要选中复框“Processbinaryascharacter”。

(作者:MatthewSchroeder译者:曾少宁/陈柳来源:TT中国)



TT数据库技术专题之“SQLServer十大热门技巧”Page28of92





如何创建与DB2链接的SQLServer服务器(二)



步骤6

在下一个截图(图G)中,你可以输入DB2DBA提供给你的用户名/密码。



图G:输入DB2DBA提供的用户或和密码

步骤7

图H中的高级选项应该只设置DB2DBA所提供的信息。在一些环境中,你可能会使用

连接池技术来减少系统的负载;而在另一些环境中,这个链接将会是只读的,所以请进行

相应的设置。



TT数据库技术专题之“SQLServer十大热门技巧”Page29of92





图H:这些选项应该根据DB2DBA所提供的信息进行设置

步骤8

在下一个截图中(图I),你可以选择进行连接,然后它会验证你的设置是否正确。



TT数据库技术专题之“SQLServer十大热门技巧”Page30of92





图I:连接SQLServer到DB2并验证设置

步骤9

在最后一个屏幕截图,你将得到你的输出。因为我们将要输入这些信息到一个链接服

务器,所以我们仍然保持选中“Universaldatalink”。



TT数据库技术专题之“SQLServer十大热门技巧”Page31of92





图J:保持选中“Universaldatalink”。

验证

图K显示你的“DataAccessTool”应该显示的结果。



TT数据库技术专题之“SQLServer十大热门技巧”Page32of92





图K:DataAccessTool的最后显示

抓取供应商字符

右击DB2/AS400,点击“Displayconnectionstring”。供应商设置字符将会出现在

底部窗口。



TT数据库技术专题之“SQLServer十大热门技巧”Page33of92





图L:供应商设置字符出现在底部窗口

建立链接服务器

显然我们需要这些供应商字符信息来创建链接服务器。但是,我们并不想包括用户名

或密码,所以我们将我们的字符信息修改为:

1、粘贴修改的供应商字符信息到正确的域中



Provider=DB2OLEDB;InitialCatalog=RDBNAME;NetworkTransportLibrary=TCP;HostC

CSID=37;PCCodePage=1252;NetworkAddress=AS400.CYPHER.NET;NetworkPort=446;Pa

ckageCollection=Library;DefaultSchema=Library;ProcessBinaryasCharacter=Fa

lse;UnitsofWork=RUW;DefaultQualifier=Library;DBMSPlatform=DB2/AS400;Defer

Prepare=False;RowsetCacheSize=0;PersistSecurityInfo=False;ConnectionPooli

ng=False;DeriveParameters=False;

2、定义产品名称——这是连接的标识。

3、数据源/分类应该与大多数系统相匹配,同时它也是服务器的名称。(如图

M)



TT数据库技术专题之“SQLServer十大热门技巧”Page34of92



4、确定你的用户名/密码,如图N。



图M:数据源/分类应该与大多数系统匹配同时作为服务器的名称。



TT数据库技术专题之“SQLServer十大热门技巧”Page35of92





图N:为你的链接SQLServer确定用户名/密码。

注意:

有时,网络连接断开后要求SQLServer实例重新启动,以便重新加载DB2驱动程序。

我不推荐使用系统名作为RDB名称,因为它会根据角色的转换而变化。最好使用一个

别名作为RDB名称,因为别名可以修改为系统名称,以指向你愿意指向的任何一个服务

器。这样,即使当你的链接服务器角色转换时你也不需要修改代码。

如果想要通过一个链接服务器向DB2系统作一个DML操作

(INSERT/UPDATE/DELETE),你需要打开目标对象的日志(通常与SQLServer日志相

同)。这是因为SQLServer能自动地在一个链接服务器上创建DML操作的事务,而且这

个功能不会被关闭。



TT数据库技术专题之“SQLServer十大热门技巧”Page36of92



现在你已经创建了第一个从SQLServer到DB2的链接服务器了。我也已经为你提供了

一些关于如何增加数据库在角色转换时的灵活性、以及如何向服务器执行DML操作的技

巧。

(作者:MatthewSchroeder译者:陈柳/曾少宁来源:TT中国)





TT数据库技术专题之“SQLServer十大热门技巧”Page37of92





SQLServer数据库设计灾难:不该做什么



如果一个外人仔细地查看你的SQLServer数据设计时,你会感觉到窘迫吗?有没有

可能在你的表中实现一个外键约束呢?你是否在字段中使用了正确的数据类型?你是否按

规范定义的方式进行表/字段命名?或者数据库的体系结构是否让人很费解?数据库体系

架构师BrianWalker根据他多年的SQLServer经验,提出了许多用于改进数据库设计和

SQLServer性能的建议。

一些业务数据库的状况很糟糕。

我曾经在五个星期里检查过三个业务数据库,我至今仍然为我所发现的状况感到震

惊。这些都是作为那些能够年产上百万美元公司的关键业务基础服务的SQLServer数据

库。每天,上百个员工都依靠这些数据库来实现准确性、稳定性和性能。从我个人来说,

我不再相信这些数据库能够存储我的iPod中的2,600首歌曲。

数据库支持它们各自的业务,但它们都受到性能问题的困扰。数据库中有许多问题,

但这些业务仍然工作在这些服务器硬件和生产环境DBA的问题中。修复这些问题是非常困

难的,因为已经有几个应用程序都有适应这些数据库设计缺点的代码。由于额外的开销和

功能丢失,业务受到了影响。同时,数据库设计也使SQLServer变得脆弱。

过去的问题

那么,我所指的业务数据库到底哪些方面出了问题呢?答案是所有方面,而且非常严

重。它们的规范化很差。有一些数据库表没有主键。表之间的许多关系都没有使用外键进

行约束。索引的使用也很随意。重要的业务逻辑都堆积在触发器中。许多字段的数据类型

是不恰当的。而对于一致性呢?可能参加“美国偶像”第一回合海选的竞争者的造型比这

些数据库更有一致性的。



TT数据库技术专题之“SQLServer十大热门技巧”Page38of92



规范化的好处一般是很好理解的,所以我将不会花太多时间进行解释。可以这样说,

这些数据库的表都还没有达到1NF的要求。表没有主键约束明显违反了1NF的规范。而

且,有一些表还有包含多种定义值的字段。大多数表的大多数字段都是可为NULL的,这

也违反了有争议性的1NF规范。我个人看来,我认为可为NULL的字段一定会给某些情况

下的开发人员带来麻烦。

实现外键约束应该是第二特性,而保证数据统一的好处是很重要的原因。这些数据库

的一些表包含很多很多的孤立行。这些数据库缺少合适的声明引用完整性(Declarative

ReferentialIntegrity,DRI)的结果会给COBOL程序员再来巨大的麻烦。其中一个数据

库的几个表的状况更令人直冒冷汗的。下面是一个假定的类似的例子。

假定你有一个Book表,它有一个外键AuthorID字段。在大多数行中,AuthorID字段

包含一个指向Author表的外键。在一些行中,AuthorID字段包含一个指向Editor表的外

键。而在另一些行中,AuthorID字段包含指向Publisher表的外键。有另一个字段负责指

出AuthorID字段包含的引用是哪一种类型的。因此,这是不可能实现一个外键约束的。

我说得没错吧!

全面的和正确的DRI可以生成一些非常有用的SQL代码。举例来说,可以为所有的外

键生成索引,这可以显著地提高JOIN子句调用的性能。生成索可以构成数据库开发的基

础,从而我们不需要在性能调优时一个个地添加这些索引。另外一个例子,它还可以生成

用于审计或日志目的的SQLServer触发器。通常,我认为触发器应该专门用于此类任

务,而业务逻辑则由存储过程来完成。

在我所检查的数据库中有许多字段选用了不恰当的SQLServer数据类型。它们混淆

使用了单字节(标准的)字符串和双字节(国际的)字符串。它们有许许多多固定长度的

字符字段,如20,30,40和50。它们有许许多多字段使用了datetime数据类型,而其实

smalldatetime数据类型应该更符合它们的要求。这些数据类型选择浪费了存储空间并且

降低了读/写性能。

保持一致性



TT数据库技术专题之“SQLServer十大热门技巧”Page39of92



在这些数据库发现的技术问题让我很不安,而缺少足够的一致性让我更难受。不一致

的最主要方面是命名规范。10个数据库开发人员就会有至少10个“最佳的”命名规范。

当然,我也有我自己习惯的命名规范,但这里有一个忠告给那些还想创建一个规范的人。

这就是:定义一个命名规范,然后再使用它。每一个地方,每时每刻都应该这样做。如果

一个数据库中有许多的命名规范是非常糟糕的。

当你在定义一个命名规范时,你要确保考虑到了所有方面。要确定表名的单数或复

数。要确定好缩写、大写、特殊字符和前/后缀的使用方法。要为所有对象定义一个命名

规范。包括表、字段(主键、外键等)、存储过程、方法、视图、触发器、索引、主键约

束、外键约束、检查约束和默认值。任何遗漏都可能造成混乱。

表结构的一致性和可推测性可以带来许多的好处。比如,对旧数据的存档和清理会受

到表结构的很大影响。这可能是你处理关系数据库时可能遇到的最复杂的事了。正确的做

法是先选择一个父记录行(或一组父记录行),然后在派生表中复制/删除它和每一个相

关的记录行。如果所有的表都有一致的结构,你就可以通过简单地调用存储过程来实现存

档和清理。

我检查的这些数据库同时使用了几个不同的表结构。主键字段是不可推测的。外键字

段也是不可以推测。审计字段也一样不可以推测。同时IDENTITY属性的使用也是不可推

测的。因此,进行存档和清理需要为每一个表仔细编写特定的SQL代码来实现,这给维护

带来巨大的工作量。在我个人看来,我认为表结构的不一致可能是许多业务数据库的最严

重的设计缺点。

请阅读第二部分《SQLServer数据库设计灾难:它是如何开始的》,Walker会为你

解释业务数据库糟糕的现状是怎么样的,以及你应该如何避免这些麻烦。

(作者:BrianWalker译者:陈柳/曾少宁来源:TT中国)



TT数据库技术专题之“SQLServer十大热门技巧”Page40of92





用存储过程查询SQLServer表和其它对象大小





Sp_spaceused是随SQLServer发布的一个存储过程,它用来显示SQLServer对象所

占用的硬盘空间。但是我往往发现它并不能满足要求。比如,当我想要查看一个特定的

SQLServer数据库的用户表大小概况时,或者希望看一下前10个最大的索引对象,或者

需要计算一组表所占用的空间总大小时,sp_spaceused并不能做到。

所以,我创建了存储过程sp_SOS,它是sp_spaceused的扩展版本,它可以用来计算

SQLServer对象空间和执行其它的功能。

在sp_SOS中我依然保持了sp_spaceused的核心功能——如,计算数据、索引总和的算

法,为一个对象保留和释放空间。同时我还增加了数据库大小计算部分,并将得到一个单

独用于数据大小报告的存储程。点击下载代码列表1:sp_SOS的完整T-SQL定义。

Sp_SOS有8个输入参数,见表1。

VariableDatatype

Nullable

Default

Default

implication

@DbNamesysnameYesNULL

Current

database

当前数据库

@SchemaNamesysnameYesNULL

Allschemas

所有的Schemas

@ObjectNamesysnameYes%

Includingall

objectsin"LIKE"



TT数据库技术专题之“SQLServer十大热门技巧”Page41of92



clause

在“LIKE”子句

中包含所有对象

@TopClausenvarchar(20)YesNULL

Allobjects.

Canbe"TOPN"or

"TOPNPERCENT"

所有对象。可以

是“TOPN”或“TOP

NPERCENT”。

@ObjectTypenvarchar(50)YesNULL

Allobjects

thatcanbesized.

Validvaluesare

S(system),

U(user),

V(indexedview),

SQ(servicebroker

queue),

IT(internaltable)

oranycombination

ofthem

所有可以计算大

小的对象。其中有效

值包括S(system,

系统),U(user,

用户),V(indexed



TT数据库技术专题之“SQLServer十大热门技巧”Page42of92



view,索引视图),

SQ(servicebroker

queue,服务代理队

列),IT(internal

table,内部表)或

它们的任意组合

@ShowInternalTablenvarchar(3)YesNULL

Includes

internaltable.

TheParent

excludesitin

size

包括所有内部

表。Parent除外。

@OrderBynvarchar(100)YesNULL

Byobject

name,canbeany

sizerelated

column.Valid

shorttermsare

N(name),R(row),

T(total),

U(used),

I(index),

D(data),F(free

orunused)and

Y(type)

对象名排序,可



TT数据库技术专题之“SQLServer十大热门技巧”Page43of92



以是任意与大小相关

的字段。有效的缩写

有N(name),R

(row),T

(total),U

(used),I

(index),D

(data),F(free

orunused)和Y

(type)。

@UpdateUsagebitYes0

Donotrun

"DBCCUPDATEUSAGE"

不运行“DBCC

UPDATEUSAGE”。

表1:sp_SOS的参数变量和它们的特性。

我更喜欢使用类似公式化的样式,以使它更好地解释数字关系。例如,公式

“Total(MB)-Unused(MB)==Used(MB)=Index(MB)+Data(MB)”,使用的空间是总

大小与未使用大小的差,也是索引与数据的大小之和。sp_spaceused中的“reserved”字

段实际上等于sp_SOS的总大小。内部表是SQLServer2005和SQLServer2008的一个

新概念。它们是父对象处理XML主索引、ServiceBroker队列、全文索引和查询通知订阅

的中间表。

在计算父对象总和时,类型202(xml_index_nodes)和204

(fulltext_catalog_map)的内部表应该被加到总大小中。因此,我在sp_SOS中设计了

一个包含两个部分的临时基本对象表(##BO)。左半部分包含6个字段表示子对象。而右

半部分是父对象。当一个父对象拥有一个子对象,它会显示不同的模型、模型ID、对象名



TT数据库技术专题之“SQLServer十大热门技巧”Page44of92



和对象ID。否则,名称和ID是相同的。当一个内部表显示时,它们的父名称显示在括号

中以表示清晰的关系。

对象类型的开头与MicrosoftSQLServerBooksOnline一致。它们可以是系统表

(S)、用户表(U)、视图(V)、服务队列(SQ)或内部表(IT)。每一种类型是由一

个或多个空格、逗号或分号分隔。分隔符的数量和顺序并不重要。如果你使用除了这些允

许的分隔符之外的字符时,sp_SOS会报错并退出。另外这个存储过程是兼容Unicode和大

小写敏感的。

Sp_SOS可以运行在SQLServer2000、2005和2008上。在SQLServer2000中,

sp_SOS报告的值是不可以更新的。@UpdateUsage参数可以为每一次运行指定一个“DBCC

UPDATEUSAGE”以确保这些值是下面报告的当前值。但是要注意它可能影响大型数据库的

性能。从SQLServer2005开始,sp_spaceused总是报告正确的数值,它使DBCC命令不

再有用了。

以下是一些如何使用sp_SOS的场景的典型说明:

@DbName是你想要在SQLServer中查找对象空间的数据库名称。如果没有数据库名,

它将会使用当前数据库。比如,如果你想快速地查看AdventureWorks数据库中的所有数

据库对象空间,你可以运行列表2中的T-SQL语句。



USEAdventureWorks;

EXECdbo.sp_SOS;

列表2:AdventureWorks数据库中的所有对象占用空间概况。注意所有的参数都是默

认值。执行结果显示所有按字母排序的模型对象。

@SchemaName和@ObjectName这两个参数都将通配符%作为默认值。这让你对有类似模

式名称或拥有者名称的对象组进行求和。我们仍然使用AdventureWorks作为示例数据



TT数据库技术专题之“SQLServer十大热门技巧”Page45of92



库,而我们想要按硬盘空间使用状况列出所有类似于“Sales”的Sales模型对象。我们

还不想显示内部表。我喜欢先运行“DBCCUPDATEUSAGE”更新任何不正确的值。其中使用

的T-SQL语句类似于代码列表3。

sp_SOS''AdventureWorks'',''Sales%'',''Sales%'',NULL,''SQ,;uv;iT;'',

''no'',

''U'',1

列表3:列出Sales模型所拥有名称类似于“Sales”的对象,按硬盘使用空间降序排

列。

类似于列表3,在列表4中的命令可以获取特定对象的大小信息。注意其中大小表示

对象属性GUI显示值和sp_SOS或sp_spaceused返回值的差。此外,注意补充的父对象名

在XML索引后面以表示它们的关系。

sp_SOS''AdventureWorks'',NULL,''xml_index_nodes_309576141_32000'',

NULL,''IT'',

''yes'',''N'',0

列表4:检查一个特定对象的使用空间。因为它是一个内部表,因此模型名被忽略

了。显然一个对象不需要排序,所以@OrderBy参数也被忽略了。

下面是在我管理的一个SQLServer2000数据库中sp_SOS运行的2个屏幕截图:

1、你可以在图1中看到2组表,ARCHIVED_HISTORY和HISTORY。我经常需要计算

HISTORY表的总和。通过sp_SOS,我可以在结果最后计算值的总和。图2显示每一个相关

表上执行DBCCUPDATEUSAGE的详细信息。箭头(==>)表示实际的命令,后面是更新的明

细。



TT数据库技术专题之“SQLServer十大热门技巧”Page46of92





图1:sp_SOS显示了一个SQLServer2000用户数据库的分组用户表,它们有相似的

名称和统计空间大小。





TT数据库技术专题之“SQLServer十大热门技巧”Page47of92



图2:SQLServer2000QueryAnalyzer显示sp_SOS代码段以及“DBCC

UPDATEUSAGE”命令的详细结果。这时,大多数的对象需要更新它们的大小信息。

最后,这是sp_SOS在SQLServer2008CTP的运行情况。使用列表5的脚本,我

们可以得到图3显示的结果。

列表5:在SQLServer2008CTP上的AdventureWorks2008数据库根据对象类型顺序

对所有用户表、视图、内部表和服务队列排序。最后运行DBCCUPDATEUSAGE,同时显示内

部对象。



图3:兼容SQLServer2008CTP的sp_SOS在AdventureWorks2008数据库运行

后显示根据对象类型排序的所有对象列表。

我不能一一解释sp_SOS执行的所有不同的参数设置。如果你发现一些有趣的或

与预期行为有冲突的结果时,请给我发一个评论,我将会检查一下看是否能再改进。

你可以阅读我接下来的关于存储过程sp_SDS文章。sp_SDS不仅仅能确定“SQL

数据空间”,它也可以用于监控数据的增长,并在数据或日志文件增长时提醒DBA,执行



TT数据库技术专题之“SQLServer十大热门技巧”Page48of92



一个日志备份事务,甚至提供文件级的详细分析,这样DBA就可以压缩文件以获取更多空

余空间。

(作者:BrianWalker译者:陈柳/曾少宁来源:TT中国)







TT数据库技术专题之“SQLServer十大热门技巧”Page49of92





如何使用向导设置SQLServer2005日志传送(一)



在SQLServer2005中建立日志传送时,你可以用许多种方法来实现主服务器和副服

务器之间的最优配置。除了一些最佳实践方法之外,我们还要从头到尾遵循SQLServer

MVPHilaryCotter日志传送安装过程,其中包括选择合适的数据库恢复模式、事务日志

路径和副数据库设置。

日志传送是SQLServer内置的一项高可用性技术,它在本质上是一个持续备份和恢

复操作。日志传送先从主(源)服务器上拷贝数据库备份和事务日志备份,然后在一个或

多个副(目的地)服务器上重建这些数据库和事务日志备份。数据库和事务日志会以备用

或无恢复模式在副服务器上重建,这样后续事务日志在主服务器上备份然后传送(或拷

贝)到副服务器并应用。

z备用模式允许用户访问重建的数据库,但不允许对它们做任何修变,只允许将来

再将日志备份恢复到数据库。

z无恢复模式不允许用户访问数据库,但是允许将来再事务日志备份恢复到数据

库。

z日志传送可以使主(源)和副或备用服务器在每个数据库上实现同步。

下面是一些需要注意的关于日志传送的重要说明:

z除了只读、tempdb、模型和任何不在完全恢复模式或简单恢复模式的数据库,你

可以传送所有的数据库。

z在碎片整理/索引/重索引操作中,事务日志的备份文件可能变得非常大。为了减

小事务日志的大小,你可以选择使用完全和批量日志恢复模式(批量日志操作能

减少索引操作日志)。



TT数据库技术专题之“SQLServer十大热门技巧”Page50of92



z某些操作会“中断”日志传送,比如将日志恢复模式从完全或批量模式改为简单

模式。

z日志传送操作在备份操作中暂停。

z延迟时间(未同步的主服务器到副服务器的时间)可以有所不同;比如在日志传

送过程中,你会每10分钟备份一次事务日志。而在1:00a.m开始的事务日志备

份可能需要10分钟才能完成。可能还需要再花费5分钟的时间将备份拷贝到目

的服务器。这就意味着你需要承担15分钟丢失数据的风险。假设你的服务器在

1:09a.m时死机了将发生什么呢?你的备份将无法生成或者拷贝到副/备用服务

器上,而你的副服务器上的数据将可能是只到12:50a.m的。

z所有依赖项都必须先在副服务器上准备好(比如,登陆、DTS或者SSIS包、SQL

Server任务和其它外部依赖)。

z客户端必须手动地重定向到备用服务器。

z应用必须知道数据库使用了日志传送——如果主服务器掉线,数据将在客户端排

队等待,直到备用服务器重新连线。最佳实践做法就是手动进行重定向;否则,

应用将可能过早或错误地重定向到备用服务器。

日志传送很受欢迎,这是因为它是一项很好理解的技术,而且并没有任何实际的距离

限制,它可以在因特网上运用,目的数据库可以被访问但只限于只读方式,同时在备用

SQLServer上发生错误后的30天内不需要使用授权。但是,备用服务器需要一个OS使用

授权。

在本文中,我们将探讨如何使用SQLServer2005包含的安装向导来在SQLServer

上设置日志传送的。



(作者:HilaryCotter译者:陈柳/曾少宁来源:TT中国)





TT数据库技术专题之“SQLServer十大热门技巧”Page51of92





如何使用向导设置SQLServer2005日志传送(二)



使用日志传送向导

右键点击数据库,然后选择“Tasks”-“ShipTransactionLogs”,打开SQL

Server2005的日志传送向导,如图1。



图1:打开日志传送向导。

你可能会看到图2中显示的对话框。SQLServer所提供给你的是这个数据库并不是在

一个完整或批量日志恢复模式上。



TT数据库技术专题之“SQLServer十大热门技巧”Page52of92





图2:对话显示数据库是一个简单的恢复模式。

若要改变你的数据库的恢复模式,先右键点击数据库,选择“Properties”,接着在

“Options”栏中点击“RecoveryModel”下拉列表,然后选择“Full”或

“Bulk_logged”恢复模式。如图3所示。最后点击“OK”。

注意:如果你选择了这些恢复模式并且你对你的数据库进行备份或者已经备份了数据

库,你将需要安排数据库备份调度来维护你的事务日志。日志传送向导将为你配置此项功

能。



TT数据库技术专题之“SQLServer十大热门技巧”Page53of92





图3:更改数据库恢复模式。

当为你的数据库设置了正确的恢复模式后,右键点击数据库,然后再次选择“Ship

TransactionLogs”。你将得到如图4所显示的对话框。



TT数据库技术专题之“SQLServer十大热门技巧”Page54of92





图4:配置日志传送。

注意:在这个图中,我选中了复选框来将它作为日志传送配置中的主数据库。请务必

选择这个复选框。点击“BackupSettings”,将显示如图5所示的“TransactionLog

BackupSettings”窗口。

备份事务日志可以有两种方式:

z网络路径

z本地路径

如果你是备份到网络路径,你将需要较多的事务日志备份时间,但可以减少在主服务

器上的空间需求。网络路径必须能到达你想要存储事务日志备份的副服务器的位置。大多

数DBA使用网络共享来备份文件,因为他们希望在副服务器上的事务日志备份文件,以此

应对主服务器出现死机的状况。



TT数据库技术专题之“SQLServer十大热门技巧”Page55of92



本地路径选项将事务日志备份在主服务器的本地路径上。请确认事务日志备份不要备

份在与数据库数据文件或日志文件存放的同一物理驱动器上。如果它们被备份到同一物理

驱动器上,将导致I/O抢占和整体SQLServer性能降低。

图6显示一个完整的TransactionLogBackupSettings窗口。注意在共用名之后有

一个美元符号。这个符号的作用是对用户隐藏共享,并且只有知道共用名的用户才能够进

行访问。这是一个良好的安全实践。



图6:TransactionLogBackupSettings显示一个网络路径隐藏共享。

其中有一个选项是设置保留事务日志备份时间长度,而另一个选项是设置在特定时期

没有备份时的提醒临界值。我发现了在默认情况下事务日志备份保留三天是足够的。因

此,我通常建立一个相对较小的警报,如20分钟,但是当发生数据库备份时,就不再有



TT数据库技术专题之“SQLServer十大热门技巧”Page56of92



日志备份,因此如果你的数据库备份需要一个多小时,那么你将会不断接收到提醒。所以

要设置一个适合你的环境的值。并且请记住:过分频繁的警示将导致你忽略关键的警示。

在你设置了事务日志备份位置、保留期间、警报时间和时间表,点击“OK”。接着你

将返回“DatabaseProperties”对话框,如图4所示。点击“Next”按钮,进入副

“DatabaseSettings”对话框,如图7所示。



图7:副数据库设置。

(作者:HilaryCotter译者:陈柳/曾少宁来源:TT中国)









TT数据库技术专题之“SQLServer十大热门技巧”Page57of92





如何使用向导设置SQLServer2005日志传送(三)



在此对话框中,你可以选择副服务器(你将把事务日志拷贝到这个服务器上)以及副

数据库(日志所要传送到的数据库名称)。

注意下面这些针对InitializeSecondaryDatabase的选项:

zYes,generateafullbackupoftheprimaryandrestoreitintothe

secondarydatabase.这个选项创建了一个你想要进行日志传送的数据库的备份,然

后将它恢复到副服务器上。

zYes,restoreanexistingbackupoftheprimarydatabase.如果你想要使用一个

之前备份的数据库,就可以使用这个选项。这里有一个选项用于选择路径和备份名

称。

zNo,thesecondarydatabaseisinitialized.Usethisoptionif:在以下情况使

用这个选项:

1、你想要进行日志传送的数据库备份已经恢复到副数据库了。

2、主数据库已经是完整或批量日志恢复模式。

3、从备份发生后主数据库上没有再做任何事务日志备份,或者它们已经完成,并恢复到

副数据库上了。

4、副数据库已经使用无恢复选项重建好了。

一旦你已经配置了最适合你的选项,点击“CopyFiles”标签,如图8所示。



TT数据库技术专题之“SQLServer十大热门技巧”Page58of92





图8:CopyFiles对话框。

在“CopyFiles”标签中选择你从主服务器到副服务器上拷贝文件的存放位置。如果

你在TransactionLogBackupSettings(如图1所示)中选择一个网络路径,那么网络

途径必须映射到副服务器的物理位置上,同时你必须在此处输入路径(如,如果

\\ServerName\ShareName$是本地路径C:\Backup的共用名,那么就在此处输入这个路

径)。

你也可以使用事务日志备份存储在主服务器上的网络路径。选择你想要保留事务日志

备份的时间长度——当然,必须认识到,保留时间可能与你在“TransactionLogBackup

Settings”对话框(图1)中的设置冲突。

你同样还可以选择你希望日志拷贝到副服务器上的频率。



TT数据库技术专题之“SQLServer十大热门技巧”Page59of92



一旦你配置好了拷贝的事务日志备份文件的选项,点击“RestoreTransaction

Log”标签,如图9所示。



图9:RestoreTransactionLog标签

数据库恢复状态选项:

z无恢复模式——这是一个默认选项。在这个选项中,目的地数据库将无法使用。

z备用模式——使用这个选项,在下一个事务日志备份应用之前,目的地数据库仅仅是

只读形式。在事务日志被应用后,数据库重新将返回只读模式。这样就只允许只读访

问并且用户将无法对数据库作任何修改(如,创建索引),而且在下一个数据库备份

被应用时,他们将被断开。



TT数据库技术专题之“SQLServer十大热门技巧”Page60of92



还有一个选项是通过设置一组小时或分钟数来延迟恢复事务日志备份。有些企业想要

保持他们的备用服务器与他们的源服务器几个小时不同步。

在默认情况下,如果事务日志在定义的“Alertifnorestoreoccurswithin”间

隔的时间内没有恢复,那么就会有一个告警信息发出。通常情况下,这个警告是发生在主

服务器进行备份操作的时候。

你还有一个选项就是设置事务日志恢复发生的频率。这些设置是在Restore任务对话

窗口配置的。

你设置好后,点击“OK”,然后你将看到“DatabaseProperties”对话框(如图10

所示)的“TransactionLogShipping”对话框。



图10:TransactionLogShipping标签



TT数据库技术专题之“SQLServer十大热门技巧”Page61of92



在此对话框中,注意我们是如何配置服务器F作为我们的副服务器,同时该数据库

p2p3是我们日志传送Northwind数据库的目地数据库。你也可以日志传送到第二个副/备

用服务器——这个可能是你的DR站点的另外一个副服务器。

对于任何具备大量日志传输数据库的企业,你可能都想要创建一个监控服务器。选择

“Useamonitorserverinstance”(图10)然后点击设置按钮来配置一个Log

ShippingMonitor服务器,就可以创建一个检测服务器。如图11所示。



图11:创建一个监控服务器。

使用连接按钮,你可以连接到你想用作监控的服务器。定义连接方式,或者通过

Windows认证,或者通过SQLServer登录。你可以定义工作历史保留时间,但通常使用默

认值都是一个不错的选择,然后定义如何发送警报。默认选项(当SQLServerAgent启



TT数据库技术专题之“SQLServer十大热门技巧”Page62of92



动时自动启动)是一个不错的选择,因为这时警报几乎都是实时的。你可以选择一个每小

时提醒或者选择一个任意时间间隔。

总结

这样我们就完成了使用SQLServer2005的日志传送的介绍。这个向导有许多的选择

并且对于新手而言可能有些困惑。但是,在大多数情况下默认值都是最优选项,并且我已

经指出了在什么情况下最好选择非默认选项。

(作者:HilaryCotter译者:陈柳/曾少宁来源:TT中国)





TT数据库技术专题之“SQLServer十大热门技巧”Page63of92





用存储过程检查SQLServer数据库和日志文件大小(一)



了解SQLServer数据库的大小是许多DBA的职责之一,而这个职责你可以轻松通过

存储过程sp_SDS来完成。sp_SDS不仅能确定“SQL数据库空间”,而且它还能监测数据

库的增长,提醒DBA关于数据或日志文件的增长,执行事务日志备份,甚至提供详细的文

件级明细表,这样DBA可以压缩文件以获取最大空余空间。

本文介绍了完整的sp_SDS及其算法。相比文章《存储过程sp_SOS》,本文将进一步

阐述如何查询数据库对象的大小,包括SQLServer表。

列表1:sp_SDS的T-SQL定义。

现在,我将解释这个SQLServer存储过程是如何查找数据库的大小以及是如何使用

它的。

sp_SDS大部分输入变量是相当明确的。我们需要查询大小的数据库是

@TargetDatabase。@Level指的是报告详细程度,可以是数据库级或者单个数据库文件级

的。它的默认值是数据库级的。它会为每一个数据库显示一个汇总。一个比特值是

@UpdateUsage。它的默认值是0,表示我们并不希望在SQLServer2005和SQLServer

2008中运行“DBCCUPDATEUSAGE”。在SQL2000中,sysindexes表中的值有时候不能及

时更新。因此,为了获得准确的读取值,我们需要运行DBCC命令。@Unit参数表明报告测

量单位应该是什么,即KB、MB或GB。如果没有指定,那么使用的测量单位是兆字节的。

图1,你可以看到列表2代码执行的屏幕截图。默认情况下,该报告是数据库级的汇

总,每一行代表一个数据库。





TT数据库技术专题之“SQLServer十大热门技巧”Page64of92



USEmaster;

EXECdbo.sp_SDS;

列表2:Sp_SDS不需要参数的最简单的执行形式(所有输入变量都是null)。



图1:在测试SQLSever2005上运行没有输入参数的sp_SDS的结果。它生成一个数

据库级的以兆字节形式报告的汇总。

第一列“Weight(%)”计算的是所指定的数据库所占总数据库大小的百分比。比如,

AdventureWorks全部为469.94MB,除以总数的20,404.51MB,就是0.023(即2.3%)。

根据报告,我们很容易可以看出DBAReports占用了大多数的数据库空间(大约是

77%)。这一栏中的数据可以让DBA很容易看到数据库大概的空间使用情况。而剩下的值

相关的列被安排在一个类似于公式的结构中。

正如我在上一篇关于sp_SOS文章中提到的,我喜欢用算术公式来表示一些看起来很

费解的关系。因此,“TOTAL”列是左边和右边的相加结果。这两个等式位于不同方向的

中心。一个显示被占用的空间和剩余的自由空间。另外一个显示数据库的数据和日志构

成。下面就是以数学公式表示数字是如何得出的(仍然以AdventureWorks为例):





TT数据库技术专题之“SQLServer十大热门技巧”Page65of92



TOTAL(469.94MB)=USED(168.41MB)+FREE(301.53MB)

TOTAL(469.94MB)=DATA(243.94MB)+LOG(226.00MB)

USED(%)(35.84%)=USED(168.41MB)/TOTAL(469.94MB)

FREE(%)(64.16%)=FREE(301.53MB)/TOTAL(469.94MB)

DATA(used%)(66.02%)=used(161.06MB)/DATA(243.94MB)

LOG(used%)(3.25%)=used(7.35MB)/LOG(226.00MB)

值得注意的是在结果中数据库Test_snapshot的一些值是null。Test_snapshot是一

个快照数据库,设计中它是不允许有日志文件的。此外,在报告的底线有一个汇总行显示

了每一列的小计。

(作者:RichardDing译者:陈柳/曾少宁来源:TT中国)



TT数据库技术专题之“SQLServer十大热门技巧”Page66of92



用存储过程检查SQLServer数据库和日志文件大小(二)



通常情况下,DBA在检查数据库空间时,都会运行系统存储过程sp_spaceused,或者

从SQLServerManagementStudio获取磁盘使用报告。将sp_SDS与其它的方法作比较是

非常有趣的。图2的图表显示的是它们之间比较的几个画面组合。它包含四个部分。第1

部分是数据级的sp_SDS结果。第2部分显示sp_spaceused的查询结果。第3部分与第1

部分相类似,但它是文件级的。第4部分表示SSMS绘制的饼图。相关的值颜色突出并与

各个部分相连接。



图2:图表显示数据库级sp_SDS、文件级sp_SDS、sp_spaceused和磁盘使用饼状图

报告之间的比较。

在SQLServer2000中,EnterpriseManager的Taskpad视图与SQLServer2005所

绘制的有所不同。如图3,我所管理的其中一个数据库,叫做“LANEPMSI”,它包含54个



TT数据库技术专题之“SQLServer十大热门技巧”Page67of92



数据文件和1个日志文件。目前,我们先不考虑为什么一个4.5GB的数据库需要这么多的

数据文件——这个是厂商的选择。我所要强调的是,这么多的文件数对于DBA而言,计算

这些文件大小是很困难的。如果使用sp_SDS来获取数据就像在列表3中的T-SQL代码按

F5键(刷新)一样容易。图4反映了执行列表3中的T-SQL语句的结果。



USEmaster;

EXECdbo.sp_SDS''LANEPMSI'',''DATABASE'',1,''MB'';

EXECdbo.sp_SDS''LANEPMSI'',''file'',1,''MB'';

列表3:在SQLServer2000数据库中以数据库级和文件级执行sp_SDS。





TT数据库技术专题之“SQLServer十大热门技巧”Page68of92



图3:一个SQLServer2000数据库包含大量的数据文件,这使得显示数据库空间汇

总、已使用空间和未使用空间e非常困难。



图4:Sp_SDS可以让你查看已使用、未使用、数据和日志空间总数。它同时还将数据

库分为单独数据和日志文件,并显示了每个文件之间相应值。

Sp_SDS兼容SQLServer2000、2005和2008。图5显示了在SQLServer2008同时

运行sp_SDS和系统存储过程e中sp_spaceused的情况。你可以比较图5和图6的数据,

它们都显示了一个硬盘使用报告(DiskUsageReport)。





TT数据库技术专题之“SQLServer十大热门技巧”Page69of92



图5:Sp_SDS兼容SQLServer2008。在AdventureWorks2008示例数据库中运行

sp_SDS和sp_spaceused的结果比较。



图6:在SQLServer2008上AdventureWorks2008示例数据库的一个DiskUsage报

告饼状图。

Sp_SDS和它的计算方法对于各种DBA任务是非常有用的。你是否曾经被要求为一个管

理会议准备一份数据库空间使用报告呢?你可以使用sp_SDS来快速生成一个整洁的表格

格式报告。一个DBA的责任就是监控数据库的增长。你可以安排一个日常工作来运行

sp_SDS并将结果存储在一个表中。随着时间的推移,你将建立起一个数据仓库,并用它来

分析数据库增长趋势。

创造数据或日志增长的提醒是存储过程sp_SDS的另外一个实际应用。如果大小超过

了某个临界值,你可以发出警告或者采取其它的措施,如执行一个事务日志备份工作。有

时候DBA并不需要压缩整个数据库。他只需要缩小占用最大存储空间的一个或几个数据文

件。在这种情况下,参数@Level=''FILE''的sp_SDS可以帮助DBA快速地确定那个(些)



TT数据库技术专题之“SQLServer十大热门技巧”Page70of92



文件应该压缩。当由于生产环境中磁盘空间不足而需要重建数据库时,SQLServer数据库

空间的详细的文件级统计分析对于DBA正确转移数据库文件是非常有用的。

(作者:RichardDing译者:陈柳/曾少宁来源:TT中国)





TT数据库技术专题之“SQLServer十大热门技巧”Page71of92





SQLServer2005的DATETIME和SMALLDATETIME基础(一)



理解SQLServer的日期/时间数据类型是有一定难度的,尤其是混合使用TIMESTAMP

的时候。在关于日期/时间的这一系列的第一部分,你将了解到关于数据是如何存储在

DATETIME和SMALLDATETIME的基础知识,以及大致地了解TIMESTAMP数据类型——它经常

与两种主要的日期/时间数据类型相混淆。

在SQLServer2005使用日期/时间值有时候会很混淆。因为日期/时间数据类型同时

存储日期和时间值,而这些值的操作并不总是一个简单的过程,或者看起来不简单的。

当操作这类数据时,对于这些数据类型有一个基本的了解是很有重要的。在本文中,

我将介绍SQLServer中的两种基本的日期/时间数据类型——DATETIME和

SMALLDATETIME,以及数据是如何在这两种类型中存储的。另外,我还将概括介绍

TIMESTAMP数据类型,这样你就可以了解到它与两种日期/时间数据类型的不同。

SQLServer的DATETIME数据类型

毫无疑问,DATETIEM数据类型对你的应用是最有用的。DATETIME字段(或一个变

量)中的值是以两个4位整型存储的。第一个整型表示日期,而第二个整型表示时间。

我们是从基准日期1900年1月1日开始的计算日期的整数的。整数表示该日期之前

或之后的天数。因此,DATETIME数据类型仅仅支持由4位范围整数表示的日期。这就意味

着DATETIME字段的一个日期必须处于1735年1月1日到9999年12月31日之间。

第二个在DATETIME值的整数,即时间整数,存储了午夜后的1/300-秒单位的数字。

这就意味着时间是以毫秒为单位存储的,并精确到3.33毫秒。因此,当你在DATETIME

字段中插入一个值,SQLServer将把时间转换成.000、.003或.007秒。下面的表显示了

SQLServer是圆整时间值的几个例子:



TT数据库技术专题之“SQLServer十大热门技巧”Page72of92



TimeexampleRoundedto:

10:10:10.989

10:10:10.990

10:10:10.991

10:10:10.990

10:10:10.992

10:10:10.993

10:10:10.994

10:10:10.993

10:10:10.995

10:10:10.996

10:10:10.997

10:10:10.998

10:10:10.997

10:10:10.99910:10:11.000

这个表的时间是以小时、分钟、秒钟顺序列出的,并且适当地将秒精确到毫秒。

正如你所看到的,DATETIME字段中的两个整数一起表示一个特定日期的某一特定时

间。当你从一个DATETIME字段中检索一个值时,它将日期和时间显示为一系列的数字。

比如,下面的Transact-SQL语句就是从DatabaseLog表中的PostTime字段检索数据,

这个表也是AdventureWorks示例数据库中的一部分:



SELECTPostTimeFROMdbo.DatabaseLog

WHEREDatabaseLogID=1

PostTime字段是配置为DATETIME数据类型的。当你在SQLServerManagement

Studio中检索值时,所检索到的值在默认情况下以下面的格式返回:





TT数据库技术专题之“SQLServer十大热门技巧”Page73of92



PostTime

-----------------------

2005-10-1401:58:27.567

(1row(s)affected)

注意,日期显示首先是年(2005),接着是月(10),然后是日(14)。然后日

期后面是时间,也就是1小时、58分和27.567秒。值作为一个整体,它所指的是2005年

10月14日,大约是凌晨1:58的日期和时间。

(作者:RobertSheldon译者:陈柳/曾少宁来源:TT中国)





TT数据库技术专题之“SQLServer十大热门技巧”Page74of92



SQLServer2005的DATETIME和SMALLDATETIME基础(二)



SQLServer的SMALLDATETIME数据类型

SMALLDATETIME数据类型类似于DATETIEM,只是它的值长度有限。SMALLDATETIME值

是用2个2位整数存储的。第一个整数表示日期,而第二个整数表示时间。

与DATETIME数据类型一样,SMALLDATETIME数据整数也是相对于基准日期1900年1

月1日计算的。但是,整数仅仅表示在基准日期之后的天数,而不包括之前的日期。这

就意味着SMALLDATETIME字段中的日期必须处于1900年1月1日到2079年6月6日之

间。

SMALLDATETIME值中的第二个整数——时间整数——存储午夜之后的分钟数。时间并

不包括秒数,而且,如果值中包括秒,它们是以下面的方式圆整的:

z小于或等于29.998秒的值向下圆整为前一分钟。

z大于或等于29.999秒的值向上圆整为后一分钟。

下表显示了几个SQLServer是圆整时间值的例子:



TimeexampleRoundedto:

14:22:29.996

14:22:29.997

14:22:29.998

14:22

14:22:29.999

14:22:30.000

14:22:30.001

14:23



TT数据库技术专题之“SQLServer十大热门技巧”Page75of92



最初这个表中的时间是按照小时、分钟、秒钟、毫秒的顺序列出的。但是,正如你所

看到的,这些时间值都被圆整为时和分,而不包括秒。当你查询SMALLDATETIME值时,事

实上你是可以看到表示秒的数字的,而且这些数字总是显示为00,但没有毫秒。比如,下

面这个SELECT语句使用了CAST方法来将DATETIME值转换成SMALLDATETIME值:



SELECTCAST(PostTimeASSMALLDATETIME)AS[Date/Time]

FROMdbo.DatabaseLog

WHEREDatabaseLogID=1

与先前的例子一样,这个语句在DatabaseLog表中的PostTime字段中查询到数据。

只是这一次这个语句返回了稍微有些不同的结果:



Date/Time

-----------------------

2005-10-1401:58:00

(1row(s)affected)

正如你所看到的,时间被向下圆整为01:58。虽然表示秒的两个数字也被包括在内,

但是它们总是显示为00。(注意,CAST方法,与CONVERT方法相似,都是一个T-SQL显

式地将一个日期类型转换成另外一个类型的方法。我将在这一系列的后面的文章中继续探

讨CAST和CONVERT方法。你也可以在MicrosoftSQLServerBooksOnline上找到关于

这两个方法的资料)。

(作者:RobertSheldon译者:陈柳/曾少宁来源:TT中国)







TT数据库技术专题之“SQLServer十大热门技巧”Page76of92



SQLServer2005的DATETIME和SMALLDATETIME基础(三)



SQLServer的TIMESTAMP数据类型

另外一个很重要的数据类型是——TIMESTAMP。TIMESTAM与DATETIME和

SMALLDATETIME是非常不一样的。首先,它基本上与日期或时间无关。但是,它与行版本

化却有着千丝万缕的关系。我只在本文中作阐述,是因为它经常与日期/时间数据类型相

混淆。

TIMESTAMP数据类型字段自动地生成二进制值,它表的每一行提供一个版本戳记。当

你每插入一个记录行时,就会有一个版本戳记被插入了TIMESTAMP字段中。每次你更新

行,TIMESTAMP值也随之更新。

结果,TIMESTAMP字段是一个确定一个行最近是否被修改过的很方便的方法——当你

正在开发一个支持用户并发的应用时,这是一个非常有用的特性。比如,你可以使用

TIMESTAMP值,通过比较TIMESTAMP的原始值与最近值来确定事务是结束还是回滚。如果

值是一样的,那么你可以结束事务。否则你必须回滚该事务,因为你很快便知道有另一

个用户已经修改了行。

TIMESTAMP值使用一个数据库计数器,它随着每次行的插入或更新而递增。因为

TIMESTAMP是一个二进制值,一个包含了TIMESTAMP字段的行将自动存储一个类似于下面

的值:



0x00000000000007DD

如果行被更新,那么值也将改变。

当操作TIMESTAMP栏时,必须考虑以下几点:



TT数据库技术专题之“SQLServer十大热门技巧”Page77of92



z这个数据类型是一个递增的数字而且不保存日期/时间数据。

z这个数据类型不可以用作候选键,比如主键。

z一个表只能包括一个TIMESTAMP字段。

z这个数据类型的主要目的是支持行版本化。事实上,ROWVERSION是TIMESTAMP数据

类型的同义词。

正如你所看到的,TIMESTAMP字段的范围非常有限。或许除了使用TIMESTAMP数据类

型来支持行版本化,其它的情况你都应该使用DATETIME和SMALLDATETIME数据类型,包

括当你想要记录一个数据被修改的确切时间。同样的,我在此处提及TIMESTAMP数据类型

仅仅是为了更好得区分实际的日期/时间数据类型。

后面的文章中,我将进一步探讨DATETIME和SMALLDATETIME类型值的操作。你将可

以学到如何转换日期/时间值、从这些信息中如何获取特定的信息和对值进行差计算。我

甚至还将探讨SQLServer2008中的新的日期/时间数据类型。

(作者:RobertSheldon译者:陈柳/曾少宁来源:TT中国)









TT数据库技术专题之“SQLServer十大热门技巧”Page78of92



配置SQLServer内存设置(一)



与其它的应用一样,SQLServer应用需要内存才能运行。但是,与大多数应用不同的

是,SQLServer仅仅允许你决定它可以使用多少内存。这是很有用的,因为SQLServer

需要更多的内存。

服务器内存选项是在GUI中设置或使用sp_configure存储过程的调整“最大化服务

器内存(MB)设置”来设置的。



图1:设置服务器内存属性

与大多数应用不同的是,你可以通过启用AWE(AddressWindowingExtensions)内存

设置来配置SQLServer使用超过2GB的RAM,这可以在相同的内存设置GUI上设置或者通



TT数据库技术专题之“SQLServer十大热门技巧”Page79of92



过sp_configure存储过程来调整“AWE启用”设备。这两个都是高级设置,在没激活

“显示高级选项”设置之前是无法看到的。

SQLServer需要的RAM总数

有一说法很适合MicrosoftWindows:当拿不定主意时,就多买些RAM。这个说法对

于SQLServer就不是很适用了,除非SQLServer只拥有非常小的数据量。SQLServer要

求服务器上至少有512RAM,而Microsoft推荐使用1GBRAM。我个人的建议是服务器上

至少有1.5GBRAM,1GBRAM用于SQLServer,512MBRAM用于Windows。如果SQL

Server使用了服务器上所有的内存,而Windows没有足够的内存来运行,那么SQL

Server的运行将会类似于内存不足情况。当Windows开始在硬盘驱动器进行越来越多的

RAM页面调度时,查询响应时间将会增加,CUP使用率将上升以及磁盘I/O将暴涨。

虽然跟SQLServer2000不同的是,SQLServer2005没有RAM限制,但是软件选择

依然是很重要的。当选择你的操作系统(OS)时,你一定要选择符合你的内存要求的正确

的版本。Windows2003EnterpriseEdition支持最多64GBRAM——远远超过Windows

2003DataCenterEdition要求。因此,购买一个128GBRAM的服务器和Windows2003

EnterpriseEdition将会浪费一半的内存。

最小和最大服务器内存设置

在SQLServer中有两种数字内存设置——最小服务器内存和最大服务器内存。虽然

关于最小服务器内存设置是如何工作的存在一些争论,但是最大服务器内存是很明确的:

它只不过就是SQLServer可使用的最高的内存总数。

很多人认为最小服务器内存设置是指在SQL第一次启动时,SQLServer应该使用多少

内存,但是事实并非如此。最小服务器内存设置是一种低水印设置。如果Windows需要从

SQLServer回收内存,它将要求SQLServer释放它占用的内存。SQLServer将返回内存

到操作系统,直到占用的内存总量达到最小服务器设置值。



TT数据库技术专题之“SQLServer十大热门技巧”Page80of92



通常情况下,我建议的最大内存设置为低于服务器内存总额512MB的值。但当服务器

上大约有8GBRAM时,我会将这一建议值改为1GB内存。我之所以这样做是因为有这样大

内存的系统上通常运行着很多系统进程——比如备份软件、大量DTS/SSIS包运行等等—

—所以额外的内存对于操作系统是很有益的。

(作者:DennyCherry译者:陈柳/曾少宁来源:TT中国)







TT数据库技术专题之“SQLServer十大热门技巧”Page81of92



配置SQLServer内存设置(二)



多个SQLServer实例的内存设置

当处理多个实例时,决定内存设置是相当棘手的。当你只有一个实例时,你只需要简

单地先确定OS需要的RAM,然后将剩下的内存设置给数据库。随着实例地增多,你必须

仔细决定每个实例需要多少内存。对于数据库较小并且每秒内事务较少的SQLServer实

例,显然比有更大数据库的实例需要较少的内存资源。当作这些决定时,你一定要清楚你

正在使用的是哪个SQLServer版本,以及它是如何计算SQLServer将使用的程序缓存

总数的。在32位平台上,程序缓存必须分配在主应用的内存空间(RAM的2GB空间),即

使启用了AWE。你可以在SQLServerwithMr.Denny博客上阅读更多关于程序缓存的内

容。

32-bitplatforms

SQLServer200050%oftheallocatedmemoryor1GB,whicheverislower

SQLServer

2005&1t;SP2

50%oftheallocatedmemoryor1GB,whicheverislower

SQLServer2005>=

SP2

50%oftheallocatedmemoryor1GB,whicheverislower

64-bitplatforms

SQLServer200050%oftheallocatedmemoryor1GB,whicheverislower

SQLServer

2005&1t;SP2

75%ofthefirst8GB+50%ofthenext56GB+25%ofthe

RAMover64GB

SQLServer2005>=

SP2

75%ofthefirst4GB+10%oftheRAMover4GB

AWE内存管理



TT数据库技术专题之“SQLServer十大热门技巧”Page82of92



MicrosoftWindows的AddressWindowingExtensionsAPI允许应用开发者在32位

系统上访问超过2GB的内存。在WindowsServer2000中,AWE只能在AdvancedServer

和DataCenter版本的操作系统上使用。在WindowsServer2003中,这三个服务器版本

AWE都适用。为了使用AWE,你必须通过添加/PAE开关到你的boot.ini文件上以启用物理

地址扩展。在Windows2003SP1中,当安装了超过2GB的RAM时,Windows将自动启动

PAE。

另外一个需要添加到boot.ini文件中的开关是/3GB开关。/3GB开关使SQLServer

能够访问高于3GB的RAM。

Microsoft已经撰写了一篇非常出色的标题为“如何配置SQLServer使用超过2GB

的物理内存”的KB文章。但是,有很多时候/3GB开关是不应该使用。其中就包括运行

Windows2003DataCenter版本,以及有超过16GB的RAM的系统。

当在32位系统上运行SQLServer时,除非你正在使用超过2GB的RAM,否则你不能

启动AWE。因为这样做可能导致出现SQLServer性能问题。

x64/64i平台的变化

在目前的64位平台上,内存使用方面已经作了很大的改进。虽然32位平台要求你

使用AWE和PAE访问超过2GB的RAM,但是64位平台没有这些限制。在64位平台上,所

有内存都可用于应用,只要它们是作为64位的应用编译的;运行在WindowsonWindows

(WOW)的32位应用也有着与它们在32位平台上运行时的相同的内存限制。

虽然SQLServer只是提供几个简单的内存设置,但是对它进行正确的设置是极为重

要的。正确的内存设置将使SQLServer能长时间平稳地运行。内存设置必须定期检查以

确保原先的设置仍然是恰当的。毕竟,去年安装的内存总量可能已经不够用或者不正确

了。

(作者:DennyCherry译者:陈柳/曾少宁来源:TT中国)



TT数据库技术专题之“SQLServer十大热门技巧”Page83of92



SQLServer中日期/时间值到字符类型的数据转换(一)



在本文中,我将解释如何将DATETIME和SMALLDATETIME数据类型转换成字符数据,

以及如何将字符数据转换成日期/时间数据。具体来说,本章将介绍Transat-SQL支持的

两个内置SQLServer数据转换方法——隐式转换和显式转换。在前一篇的技巧《SQL

Server2005的DATETIME和SMALLDATETIME数据基础》中,我已经阐述了SQLServer是

如何使用DATETIME和SMALLDATETIME数据类型来存储日期/时间数据的。在本文中,我将

解释日期/时间数据是如何转换成字符数据和字符数据是如何转换成日期/时间数据以及

Transact-SQL是如何支持这两种执行这些数据转换的方法——隐式转换和显式转换。

本文的前提是假定你已具备T-SQL和SQLServer应用知识,并且该部分只涉及日期/

时间数据与字符数据之间的相互转换。但是,你还可以转换其它类型的数值,如将INT转

换为DATETIME。虽然在大多数情况下,你的主要工作是字符到日期/时间的转换。

隐式转换数据

当你插入数据到DATETIME或SMALLDATETIME字段中时,SQLServer会自动尝试将不

同类型的数据进行转换。例如,如果你向DATETIME字段中插入CHAR值,SQLServer将对

数据作转换——如果该值是一个可以接受的格式。如果你在CHAR栏中插入DATETIME值,

SQLServer也将作自动转换。

让我们来看看几个隐式转换例子以便更好地理解它是如何工作的。为了说明这些转

换,我使用了下面的代码在AdventureWorks示例数据库中创建LogInfo表:



USEAdventureWorks

GO



TT数据库技术专题之“SQLServer十大热门技巧”Page84of92



CREATETABLEdbo.LogInfo

(

LogIDINTPRIMARYKEY,

LogEventNVARCHAR(30)NOTNULL,

Post_DateTimeDATETIMENOTNULL,

Post_SmallDateTimeSMALLDATETIMENOTNULL,

Post_NVarCharNVARCHAR(25)NOTNULL

)

在这个表中包含了三个用于保存日期/时间信息的字段:Post_DateTime、

Post_SmallDateTime和Post_NVarChar。字段的名称反映了用于定义字段的数据类型。下

面让我们在这些字段中插入数据:



INSERTINTOLogInfo

SELECTDatabaseLogID,[Event],

PostTime,PostTime,PostTime

FROMdbo.DatabaseLog

这个语句将从DatabaseLog表(在AdventureWorks数据库)中获取数据,然后插入

到LogInfo表中。在源表的PostTime字段是DATETIME数据类型的。注意,这个字段是用

于将数据插入到LogInfo表的每个日期/时间字段的。

在你填充好表的数据后,你可以使用下面的SELECT语句来获取LogInfo表的第一行

记录:



SELECTfromdbo.LogInfo



TT数据库技术专题之“SQLServer十大热门技巧”Page85of92



WHERELogID=1

SELECT语句返回LogID值为1的记录行的所有字段的值。下面的结果显示了数据是如何存

储在表中的。

LogIDLogEventPost_DateTimePost_SmallDateTimePost_NVarChar

1CREATE_TABLE

2005-10-14

01:58:27.567

2005-10-14

01:58:00

Oct142005

1:58AM

你可以看到,每个日期/时间值都稍微有些不同。ThePost_DateTime字段存储的是完

整日期和时间值。但是,正如我们所预期的,Post_SmallDateTime字段存储一个缩短的时

间(00表示秒)。最后,Post_NVarChar存储的是一个与其它两个非常不一样的字符串

值。

默认情况下,当SQLServer将一个DATETIME或SMALLDATETIME值转换为一个字符值

时,它使用上面显示的格式(Oct1420051:58AM)。在后面的文章中,你将会知道我们

还可以将这种格式修改成其它的一些可用的格式。但是目前而言,我们要知道的重要一点

是SQLServer是如何隐式转换日期/时间值的。现在让我们来看看SQLServer中的显式

数据转换。

(作者:RobertSheldon译者:陈柳/曾少宁来源:TT中国)













TT数据库技术专题之“SQLServer十大热门技巧”Page86of92





SQLServer中日期/时间值到字符类型的数据转换(二)



显式转换数据

显式地转换日期/时间值,你必须使用CAST或CONVERTTransact-SQL方法。由于

CAST方法是两者中相对简单的,因此我们从这个开始介绍。下面这个SELECT语句使用

CAST方法将Post_NVarChar字段中的字符数据转换成一个DATETIME值。



SELECTLogID,LogEvent,

CAST(Post_NVarCharASDATETIME)ASPost_Converted

FROMdbo.LogInfo

WHERELogID=1

当你使用CAST方法时,你必须指定源字段名称(或其它一些表达式)、AS关键字和

值转换的数据类型——这里是DATETIME。当你运行这个语句时,值就被转换了,如下面显

示的结果:

LogIDLogEvent

Post_Converted<?xml:namespaceprefix=o/><?xml:namespace

prefix=o/><?xml:namespaceprefix=o/>

1CREATE_TABLE2005-10-1401:58:00.000

(1row(s)affected)

注意,Post_Converted字段(别名赋给SELECT子句中的字段)预期是包括完整日期

时间值并精确到毫秒的DATETIME格式。但是,秒是表示为00.000。这是因为当SQL



TT数据库技术专题之“SQLServer十大热门技巧”Page87of92



Server转换原始值时,它会去掉秒而只存储小时和分钟值。当你将值转换回DATETIME

时,SQLServer将秒设置为00.000。

然而,如果日期/时间值是以作为字符串存储的并使用DATETIME数据所使用的格式,

那么SQLServer就会保留秒。比如,下面的SELECT语句使用CAST方法将字符串值转换

为DATETIME:



SELECTCAST(''2005-10-1401:58:27.567''ASDATETIME)AS[Date/Time]

下面的结果显示秒和毫秒现在被保存了:

Date/Time

2005-10-1401:58:27.567

(1row(s)affected)

除了显式地将DATETIME(或SMALLDATETIME)值转换成字符数据,你也可以使用CAST

方法将DATETIME数据转换成字符数据。下面的SELECT语句使用CAST功能从

Post_DateTime字段中获取数据:



SELECTLogID,LogEvent,

CAST(Post_DateTimeASVARCHAR(20))ASPost_Converted

FROMdbo.LogInfo

WHERELogID=1

正如你所看到的下面显示的结果,句法将值转换成VARCHAR:



TT数据库技术专题之“SQLServer十大热门技巧”Page88of92



LogIDLogEventPost_Converted

1CREATE_TABLEOct1420051:58AM

(1row(s)affected)

注意,当SQLServer隐式地将DATETIMER值转换成NVARCHA时,转换的值的格式现

在就是你先前看到格式。

现在你了解了如何使用CAST方法,那么让我们接着看看CONVERT方法。最基本的,

CONVERT方法返回与CAST方法一样的结果。比如,与上面的例子一样,下面的语句将

Post_DateTime值转换成VARCHAR:



SELECTLogID,LogEvent,

CONVERT(VARCHAR(20),Post_DateTime)ASPost_Converted

FROMdbo.LogInfo

WHERELogID=1

然而,注意在CONVERT方法中的参数的顺序与CAST方法的是不一样的。当使用

CONVERT时,你首先指定目标数据类型(VARCHAR),然后是源字段(Post_DateTime)的名

称,它是由逗号分隔的两个参数,而不是AS关键字。当你运行语句时,你会得到下面的

结果:

LogIDLogEventPost_Converted

1CREATE_TABLEOct1420051:58AM

(1row(s)affected)



TT数据库技术专题之“SQLServer十大热门技巧”Page89of92



结果跟前面的例子是一样的。但是,如果你想要以一定的格式显示你的日期/时间

值,而不是使用目前我们所看到的格式(Oct1420051:58AM)。这时,你可以在CONVERT

方法中添加第三个参数来指定新的格式,如下面的例子所显示的:



SELECTLogID,LogEvent,

CONVERT(VARCHAR(20),Post_DateTime,101)ASPost_Converted

FROMdbo.LogInfo

WHERELogID=1

注意,101已经作为第三个参数添加到方法中。当指定一个格式时,你必须使用由T-

SQL支持的预定义代码来表示你想要使用的格式。在这种情况下,101返回如下所显示格

式的结果:

LogIDLogEventPost_Converted

1CREATE_TABLE10/14/2005

(1row(s)affected)

Post_Converted值现在的格式是10/14/2005,这个也是代码101代表的格式。如果

你想要你的结果显示为类似于DATETIME值所显示的格式,那么你可以指定代码121,如下

面的例子:



SELECTLogID,LogEvent,

CONVERT(VARCHAR(25),Post_DateTime,121)ASPost_Converted

FROMdbo.LogInfo

WHERELogID=1



TT数据库技术专题之“SQLServer十大热门技巧”Page90of92





现在返回的结果是完整日期和时间值,精确到毫秒:

LogIDLogEventPost_Converted

1CREATE_TABLE2005-10-1401:58:27.567

(1row(s)affected)

T-SQL支持多种预定义的格式。关于用于调用每个格式的格式命名和代码的完整清单,你

可以在MicrosoftSQLServerBooksOnline中阅读CAST和CONVERT(Transact-SQL)专

题。

现在让我们来看一个不同的例子。在下面的SELECT语句中,我们使用了CONVERT方

法将Post_SmallDateTime字段栏转换成一个VARCHAR字段:

SELECTLogID,LogEvent,

CONVERT(VARCHAR(25),Post_SmallDateTime,121)ASPost_Converted

FROMdbo.LogInfo

WHERELogID=1

正如前面的例子,日期/时间值显示为121格式:

LogIDLogEventPost_Converted

1CREATE_TABLE2005-10-1401:58:00.000

(1row(s)affected)



TT数据库技术专题之“SQLServer十大热门技巧”Page91of92



注意,由于日期/时间值是从SMALLADATETIME字段中获取的,因此时间值中的秒是

00.000,这与SMALLDATETIME的是一样的。以下是如何以指定更短的长度截断VARCHAR数

据类型的秒:



SELECTLogID,LogEvent,

CONVERT(VARCHAR(16),Post_SmallDateTime,121)ASPost_Converted

FROMdbo.LogInfo

WHERELogID=1

目前CONVERT功能的数据类型参数显示为VARCHAR(16)而非VARCHAR(25),与前

面的例子一样。下面的结果显示值是如何被截断以便秒不再显示:

LogIDLogEventPost_Converted

1CREATE_TABLE2005-10-1401:58

(1row(s)affected)

这就是所有关于日期/时间值的显式转换方法。当获取这些值时,CAST和CONVERT方

法都是方便的工具(注意,这些方法同样可以用于转换其它类型的值)。在接下来的文

章中,我将阐述如何从日期/时间字段获取特定的信息,以及如何计算日期/时间值。同

时,你现在也已经掌握了如何转换这些值以及以特定格式显示它们的基本用法,这对你

是非常有用的。

(作者:RobertSheldon译者:陈柳/曾少宁来源:TT中国)





TT数据库技术专题之“SQLServer十大热门技巧”Page92of92

献花(0)
+1
(本文系sailei831首藏)