??xml version="1.0" encoding="utf-8" standalone="yes"?>久久精品国产色蜜蜜麻豆,久久精品无码专区免费东京热,久久国产福利免费http://www.shnenglu.com/ivenher/category/197.htmlzh-cnWed, 21 May 2008 09:23:17 GMTWed, 21 May 2008 09:23:17 GMT60SQL Server 索引l构及其使用Q四Q[转] http://www.shnenglu.com/ivenher/articles/12165.html爱饭?/dc:creator>爱饭?/author>Fri, 08 Sep 2006 05:49:00 GMThttp://www.shnenglu.com/ivenher/articles/12165.htmlhttp://www.shnenglu.com/ivenher/comments/12165.htmlhttp://www.shnenglu.com/ivenher/articles/12165.html#Feedback0http://www.shnenglu.com/ivenher/comments/commentRss/12165.htmlhttp://www.shnenglu.com/ivenher/services/trackbacks/12165.html 聚集索引的重要性和如何选择聚集索引

  ?a target="_blank">上一?/a>的标题中Q笔者写的是Q实现小数据量和量数据的通用分页昄存储q程。这是因为在本存储q程应用于“办公自动化”系l的实践中时Q笔者发现这W三U存储过E在数据量的情况下Q有如下现象Q?

1、分速度一般维持在1U和3U之间?

2、在查询最后一|Q速度一般ؓ5U至8U,哪怕分|L只有3|30万页?

  虽然在超大容量情况下Q这个分늚实现q程是很快的Q但在分前几|Q这?Q?U的速度比vW一U甚x有经q优化的分页Ҏ速度q要慢,借用L话说是“还没有ACCESS数据库速度快”,q个认识以D用户攑ּ使用您开发的pȝ?
  W者就此分析了一下,原来产生q种现象的症l是如此的简单,但又如此的重要:排序的字D不是聚集烦引!
  本篇文章的题目是Q“查询优化及分页法Ҏ”。笔者只所以把“查询优化”和“分늮法”这两个联系不是很大的论题放在一P是因ؓ二者都需要一个非帔R要的东西――聚集烦引?
在前面的讨论中我们已l提CQ聚集烦引有两个最大的优势Q?

1、以最快的速度~小查询范围?

2、以最快的速度q行字段排序?

  W?条多用在查询优化Ӟ而第2条多用在q行分页时的数据排序?

  而聚集烦引在每个表内又只能徏立一个,q得聚集烦引显得更加的重要。聚集烦引的挑选可以说是实现“查询优化”和“高效分”的最关键因素?
  但要既聚集索引列既W合查询列的需要,又符合排序列的需要,q通常是一个矛盾。笔者前面“烦引”的讨论中,fariqiQ即用户发文日期作ؓ了聚集烦引的起始列,日期的精度为“日”。这U作法的优点Q前面已l提CQ在q行划时间段的快速查询中Q比用ID主键列有很大的优ѝ?
  但在分页Ӟ׃q个聚集索引列存在着重复记录Q所以无法用max或min来最为分늚参照物,q而无法实现更为高效的排序。而如果将ID主键列作集烦引,那么聚集索引除了用以排序之外Q没有Q何用处,实际上是费了聚集烦引这个宝늚资源?
  册个矛盾,W者后来又d了一个日期列Q其默认gؓgetdate()。用户在写入记录Ӟq个列自动写入当时的旉Q时间精到毫秒。即使这PZ避免可能性很的重合Q还要在此列上创建UNIQUEU束。将此日期列作ؓ聚集索引列?
  有了q个旉型聚集烦引列之后Q用户就既可以用q个列查扄户在插入数据时的某个旉D늚查询Q又可以作ؓ唯一列来实现max或minQ成为分늮法的参照物?
  l过q样的优化,W者发玎ͼ无论是大数据量的情况下还是小数据量的情况下,分页速度一般都是几十毫U,甚至0毫秒。而用日期D늾范围的查询速度比原来也没有Mq钝。聚集烦引是如此的重要和珍贵Q所以笔者ȝ了一下,一定要聚集烦引徏立在Q?

1、您最频繁使用的、用以羃查询范围的字段上;

2、您最频繁使用的、需要排序的字段上?

l束?/b>

  本篇文章汇集了笔者近D在使用数据库方面的心得Q是在做“办公自动化”系l时实践l验的积累。希望这文章不仅能够给大家的工作带来一定的帮助Q也希望能让大家能够体会到分析问题的ҎQ最重要的是Q希望这文章能够抛砖引玉,掀起大家的学习和讨论的兴趣Q以共同促进Q共同ؓ公安U技事业和金监ַE做己最大的努力?
  最后需要说明的是,在试验中Q我发现用户在进行大数据量查询的时候,Ҏ据库速度影响最大的不是内存大小Q而是CPU。在我的P4 2.4机器上试验的时候,查看“资源管理器”,CPUl常出现持箋?00%的现象,而内存用量却q没有改变或者说没有大的改变。即使在我们的HP ML 350 G3服务器上试验ӞCPU峰g能达?0%Q一般持l在70%左右?
  本文的试验数据都是来自我们的HP ML 350服务器。服务器配置Q双Inter Xeon 线E?CPU 2.4GQ内?GQ操作系lWindows Server 2003 Enterprise EditionQ数据库SQL Server 2000 SP3

文章引用Q?a >http://www.vckbase.com/document/viewdoc/?id=1310



]]>
SQL Server 索引l构及其使用Q三Q[转] http://www.shnenglu.com/ivenher/articles/12164.html爱饭?/dc:creator>爱饭?/author>Fri, 08 Sep 2006 05:48:00 GMThttp://www.shnenglu.com/ivenher/articles/12164.htmlhttp://www.shnenglu.com/ivenher/comments/12164.htmlhttp://www.shnenglu.com/ivenher/articles/12164.html#Feedback0http://www.shnenglu.com/ivenher/comments/commentRss/12164.htmlhttp://www.shnenglu.com/ivenher/services/trackbacks/12164.html实现数据量和v量数据的通用分页昄存储q程

  建立一?Web 应用Q分|览功能必不可。这个问题是数据库处理中十分常见的问题。经典的数据分页Ҏ?ADO U录集分|Q也是利用ADO自带的分功能(利用游标Q来实现分页。但q种分页Ҏ仅适用于较数据量的情形,因ؓ游标本n有缺点:游标是存攑֜内存中,很费内存。游标一建立Q就相关的记录锁住Q直到取消游标。游标提供了对特定集合中逐行扫描的手D,一般用游标来逐行遍历数据Q根据取出数据条件的不同q行不同的操作。而对于多表和大表中定义的游标Q大的数据集合)循环很容易ɽE序q入一个O长的{待甚至L?
  更重要的是,对于非常大的数据模型而言Q分|索时Q如果按照传l的每次都加载整个数据源的方法是非常费资源的。现在流行的分页Ҏ一般是索页面大的块区的数据,而非索所有的数据Q然后单步执行当前行?
  最早较好地实现q种Ҏ面大小和页码来提取数据的方法大概就是“俄|斯存储q程”。这个存储过E用了游标,׃游标的局限性,所以这个方法ƈ没有得到大家的普遍认可?
  后来Q网上有人改造了此存储过E,下面的存储过E就是结合我们的办公自动化实例写的分存储过E:
CREATE procedure pagination1
(@pagesize int, --面大小Q如每页存储20条记?
@pageindex int --当前늠
)
as

set nocount on

begin
declare @indextable table(id int identity(1,1),nid int) --定义表变?
declare @PageLowerBound int --定义此页的底?
declare @PageUpperBound int --定义此页的顶?
set @PageLowerBound=(@pageindex-1)*@pagesize
set @PageUpperBound=@PageLowerBound+@pagesize
set rowcount @PageUpperBound
insert into @indextable(nid) select gid from TGongwen 
      where fariqi >dateadd(day,-365,getdate()) order by fariqi desc
select O.gid,O.mid,O.title,O.fadanwei,O.fariqi from TGongwen O,@indextable t 
           where O.gid=t.nid and t.id>@PageLowerBound 
                        and t.id<=@PageUpperBound order by t.id
end

set nocount off

  以上存储q程q用了SQL SERVER的最新技术――表变量。应该说q个存储q程也是一个非怼U的分存储过E。当Ӟ在这个过E中Q您也可以把其中的表变量写成临时表:CREATE TABLE #Temp。但很明显,在SQL SERVER中,用时表是没有用表变量快的。所以笔者刚开始用这个存储过E时Q感觉非常的不错Q速度也比原来的ADO的好。但后来Q我又发C比此Ҏ更好的方法?
  W者曾在网上看C一小短文《从数据表中取出Wn条到Wm条的记录的方法》,全文如下Q?

从publish 表中取出W?n 条到W?m 条的记录Q?
SELECT TOP m-n+1 * 
FROM publish 
WHERE (id NOT IN 
    (SELECT TOP n-1 id 
     FROM publish)) 

id 为publish 表的关键?

  我当时看到这文章的时候,真的是精ؓ之一振,觉得思\非常得好。等到后来,我在作办公自动化pȝQASP.NET+ C#QSQL SERVERQ的时候,忽然惌v了这文章,我想如果把这个语句改造一下,q就可能是一个非常好的分存储过E。于是我满|上找这文章,没想刎ͼ文章q没扑ֈQ却扑ֈ了一根据此语句写的一个分存储过E,q个存储q程也是目前较ؓ行的一U分存储过E,我很后悔没有争先把这D|字改造成存储q程Q?/p>

CREATE PROCEDURE pagination2
(
@SQL nVARCHAR(4000), --不带排序语句的SQL语句
@Page int, --늠
@RecsPerPage int, --每页容纳的记录数
@ID VARCHAR(255), --需要排序的不重复的ID?
@Sort VARCHAR(255) --排序字段及规?
)
AS

DECLARE @Str nVARCHAR(4000)

SET @Str=''SELECT TOP ''+CAST(@RecsPerPage AS VARCHAR(20))+'' * FROM 
(''+@SQL+'') T WHERE T.''+@ID+''NOT IN (SELECT TOP ''+CAST((@RecsPerPage*(@Page-1)) 
AS VARCHAR(20))+'' ''+@ID+'' FROM (''+@SQL+'') T9 ORDER BY ''+@Sort+'') ORDER BY ''+@Sort

PRINT @Str

EXEC sp_ExecuteSql @Str
GO

其实Q以上语句可以简化ؓQ?/p>

SELECT TOP 大?*
FROM Table1 WHERE (ID NOT IN (SELECT TOP 大?| id FROM ?ORDER BY id))
ORDER BY ID

但这个存储过E有一个致命的~点Q就是它含有NOT IN字样。虽然我可以把它攚wؓQ?/p>

SELECT TOP 大?*
FROM Table1 WHERE not exists
(select * from (select top (大?|) * from table1 order by id) b where b.id=a.id )
order by id

  卻I用not exists来代替not inQ但我们前面已经谈过了,二者的执行效率实际上是没有区别的。既便如此,用TOP l合NOT IN的这个方法还是比用游标要来得快一些?
  虽然用not existsq不能挽救上个存储过E的效率Q但使用SQL SERVER中的TOP关键字却是一个非常明智的选择。因为分优化的最l目的就是避免生过大的记录集,而我们在前面也已l提CTOP的优势,通过TOP 卛_实现Ҏ据量的控制?
  在分늮法中Q媄响我们查询速度的关键因素有两点QTOP和NOT IN。TOP可以提高我们的查询速度Q而NOT IN会减慢我们的查询速度Q所以要提高我们整个分页法的速度Q就要彻底改造NOT INQ同其他Ҏ来替代它?
  我们知道Q几乎Q何字D,我们都可以通过max(字段)或min(字段)来提取某个字D中的最大或最|所以如果这个字D不重复Q那么就可以利用q些不重复的字段的max或min作ؓ分水岭,使其成ؓ分页法中分开每页的参照物。在q里Q我们可以用操作W?gt;”或?lt;”号来完成这个命,使查询语句符合SARG形式。如Q?

Select top 10 * from table1 where id>200

于是有了如下分|案:

select top 大?*
from table1 
where id>
(select max (id) from 
(select top ((늠-1)*大? id from table1 order by id) as T
) 
order by id

  在选择即不重复|又容易分辨大的列时Q我们通常会选择主键。下表列ZW者用有着1000万数据的办公自动化系l中的表Q在以GIDQGID是主键,但ƈ不是聚集索引。)为排序列、提取gid,fariqi,title字段Q分别以W??0?00?00?000?万?0万?5万?0万页ZQ测试以上三U分|案的执行速度Q(单位Q毫U)

Ҏ1Ҏ2Ҏ3
1603076
10461663
1001076720130
5005401294383
100017110470250
10000247964500140
10000038326422831553
250000281401287202330
5000001216861278467168

  从上表中Q我们可以看出,三种存储q程在执?00以下的分页命oӞ都是可以信Q的,速度都很好。但W一U方案在执行分页1000以上后Q速度降了下来。第二种Ҏ大约是在执行分页1万页以上后速度开始降了下来。而第三种Ҏ却始l没有大的降势,后劲仍然很?
  在确定了W三U分|案后Q我们可以据此写一个存储过E。大家知道SQL SERVER的存储过E是事先~译好的SQL语句Q它的执行效率要比通过WEB面传来的SQL语句的执行效率要高。下面的存储q程不仅含有分页ҎQ还会根据页面传来的参数来确定是否进行数据Ll计?

--获取指定늚数据Q?

CREATE PROCEDURE pagination3
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = ''*'', -- 需要返回的?
@fldName varchar(255)='''', -- 排序的字D名
@PageSize int = 10, -- 尺?
@PageIndex int = 1, -- 늠
@doCount bit = 0, -- q回记录L, ?0 值则q回
@OrderType bit = 0, -- 讄排序cd, ?0 值则降序
@strWhere varchar(1500) = '''' -- 查询条g (注意: 不要?where)
AS

declare @strSQL varchar(5000) -- 主语?
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序cd

if @doCount != 0
begin
if @strWhere !=''''
set @strSQL = "select count(*) as Total from [" + @tblName + "] where "+@strWhere
else
set @strSQL = "select count(*) as Total from [" + @tblName + "]"
end 

--以上代码的意思是如果@doCount传递过来的不是0Q就执行Ll计。以下的所有代码都是@doCount?的情况:

else
begin
if @OrderType != 0
begin
set @strTmp = "<(select min"
set @strOrder = " order by [" + @fldName +"] desc"

--如果@OrderType不是0Q就执行降序Q这句很重要Q?/p>

end
else
begin
set @strTmp = ">(select max"
set @strOrder = " order by [" + @fldName +"] asc"
end

if @PageIndex = 1
begin
if @strWhere != '''' 

set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "
        from [" + @tblName + "] where " + @strWhere + " " + @strOrder
else

set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " 
        from ["+ @tblName + "] "+ @strOrder

--如果是第一就执行以上代码Q这样会加快执行速度

end
else
begin

--以下代码赋予了@strSQL以真正执行的SQL代码
 

set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from ["
+ @tblName + "] where [" + @fldName + "]" + @strTmp + "(["+ @fldName + "]) 
      from (select top " + str((@PageIndex-1)*@PageSize) + " ["+ @fldName + "] 
      from [" + @tblName + "]" + @strOrder + ") as tblTmp)"+ @strOrder

if @strWhere != ''''
set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from ["
+ @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
+ @fldName + "] from [" + @tblName + "] where " + @strWhere + " "
+ @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrder
end 

end 

exec (@strSQL)

GO
  上面的这个存储过E是一个通用的存储过E,其注释已写在其中了?在大数据量的情况下,特别是在查询最后几늚时候,查询旉一般不会超q?U;而用其他存储q程Q在实践中就会导致超Ӟ所以这个存储过E非帔R用于大定w数据库的查询?W者希望能够通过对以上存储过E的解析Q能l大家带来一定的启示Qƈl工作带来一定的效率提升Q同时希望同行提出更优秀的实时数据分늮法?

文章引自Q?a >http://www.vckbase.com/document/viewdoc/?id=1309

]]>
SQL Server 索引l构及其使用Q二Q[转] http://www.shnenglu.com/ivenher/articles/12163.html爱饭?/dc:creator>爱饭?/author>Fri, 08 Sep 2006 05:45:00 GMThttp://www.shnenglu.com/ivenher/articles/12163.htmlhttp://www.shnenglu.com/ivenher/comments/12163.htmlhttp://www.shnenglu.com/ivenher/articles/12163.html#Feedback0http://www.shnenglu.com/ivenher/comments/commentRss/12163.htmlhttp://www.shnenglu.com/ivenher/services/trackbacks/12163.html 改善SQL语句

  很多Z知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解。比如:

select * from table1 where name=''zhangsan'' and tID > 10000

和执?

select * from table1 where tID > 10000 and name=''zhangsan''

  一些h不知道以上两条语句的执行效率是否一P因ؓ如果单的从语句先后上看,q两个语句的是不一P如果tID是一个聚合烦引,那么后一句仅仅从表的10000条以后的记录中查扑ְ行了Q而前一句则要先从全表中查找看有几个name=''zhangsan''的,而后再根据限制条件条件tID>10000来提出查询结果?
  事实上,q样的担心是不必要的。SQL SERVER中有一个“查询分析优化器”,它可以计出where子句中的搜烦条gq确定哪个烦引能~小表扫描的搜烦I间Q也是_它能实现自动优化?
  虽然查询优化器可以根据where子句自动的进行查询优化,但大家仍然有必要了解一下“查询优化器”的工作原理Q如非这P有时查询优化器就会不按照您的本意q行快速查询?
  在查询分析阶D,查询优化器查看查询的每个阶段q决定限刉要扫描的数据量是否有用。如果一个阶D可以被用作一个扫描参敎ͼSARGQ,那么q之ؓ可优化的Qƈ且可以利用烦引快速获得所需数据?
  SARG的定义:用于限制搜烦的一个操作,因ؓ它通常是指一个特定的匚wQ一个值得范围内的匚w或者两个以上条件的ANDq接。Ş式如下:

列名 操作W?<常数 ?变量>

?

<常数 ?变量> 操作W列?/pre>
		

列名可以出现在操作符的一边,而常数或变量出现在操作符的另一辏V如Q?/p>

Name=’张三?

h>5000

5000<h

Name=’张三?and h>5000

  如果一个表辑ּ不能满SARG的Ş式,那它无法限制搜索的范围了,也就是SQL SERVER必须Ҏ一行都判断它是否满WHERE子句中的所有条件。所以一个烦引对于不满SARG形式的表辑ּ来说是无用的?
  介绍完SARG后,我们来ȝ一下用SARG以及在实践中遇到的和某些资料上结Z同的l验Q?

1、Like语句是否属于SARG取决于所使用的通配W的cd

如:name like ‘张%?Q这属于SARG

而:name like ?张?,׃属于SARG?/pre>
		

原因是通配W?在字W串的开通得烦引无法用?

2、or 会引起全表扫?
  Name=’张三?and h>5000 W号SARGQ而:Name=’张三?or h>5000 则不W合SARG。用or会引起全表扫描?

3、非操作W、函数引L不满SARG形式的语?
  不满SARG形式的语句最典型的情况就是包括非操作W的语句Q如QNOT?=?lt;>?<?>、NOT EXISTS、NOT IN、NOT LIKE{,另外q有函数。下面就是几个不满SARG形式的例子:

ABS(h)<5000

Name like ?三?

有些表达式,如:

WHERE h*2>5000

SQL SERVER也会认ؓ是SARGQSQL SERVER会将此式转化为:
WHERE h>2500/2

但我们不推荐q样使用Q因为有时SQL SERVER不能保证q种转化与原始表辑ּ是完全等L?

4、IN 的作用相当与OR

语句Q?

Select * from table1 where tid in (2,3)

?

Select * from table1 where tid=2 or tid=3

是一LQ都会引起全表扫描,如果tid上有索引Q其索引也会失效?

5、尽量少用NOT

6、exists ?in 的执行效率是一L
  很多资料上都昄_exists要比in的执行效率要高,同时应尽可能的用not exists来代替not in。但事实上,我试验了一下,发现二者无论是前面带不带notQ二者之间的执行效率都是一L。因为涉及子查询Q我们试验这ơ用SQL SERVER自带的pubs数据库。运行前我们可以把SQL SERVER的statistics I/O状态打开Q?

Q?Qselect title,price from titles where title_id in (select title_id from sales where qty>30)

该句的执行结果ؓQ?

?''sales''。扫描计?18Q逻辑?56 ơ,物理?0 ơ,预读 0 ơ?
?''titles''。扫描计?1Q逻辑?2 ơ,物理?0 ơ,预读 0 ơ?

Q?Qselect title,price from titles 
       where exists (select * from sales 
       where sales.title_id=titles.title_id and qty>30)

W二句的执行l果为:

?''sales''。扫描计?18Q逻辑?56 ơ,物理?0 ơ,预读 0 ơ?
?''titles''。扫描计?1Q逻辑?2 ơ,物理?0 ơ,预读 0 ơ?

我们从此可以看到用exists和用in的执行效率是一L?

7、用函数charindex()和前面加通配W?的LIKE执行效率一?
  前面Q我们谈刎ͼ如果在LIKE前面加上通配W?Q那么将会引起全表扫描,所以其执行效率是低下的。但有的资料介绍_用函数charindex()来代替LIKE速度会有大的提升Q经我试验,发现q种说明也是错误的:
 

select gid,title,fariqi,reader from tgongwen 
         where charindex(''刑侦支队'',reader)>0 and fariqi>''2004-5-5''

用时Q?U,另外Q扫描计?4Q逻辑?7155 ơ,物理?0 ơ,预读 0 ơ?/p>

select gid,title,fariqi,reader from tgongwen 
         where reader like ''%'' + ''刑侦支队'' + ''%'' and fariqi>''2004-5-5''

用时Q?U,另外Q扫描计?4Q逻辑?7155 ơ,物理?0 ơ,预读 0 ơ?

8、unionq不l对比or的执行效率高
  我们前面已经谈到了在where子句中用or会引起全表扫描,一般的Q我所见过的资料都是推荐这里用union来代替or。事实证明,q种说法对于大部分都是适用的?

select gid,fariqi,neibuyonghu,reader,title from Tgongwen 
          where fariqi=''2004-9-16'' or gid>9990000

用时Q?8U。扫描计?1Q逻辑?404008 ơ,物理?283 ơ,预读 392163 ơ?/p>

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-9-16'' 
union
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid>9990000

用时Q?U。扫描计?8Q逻辑?67489 ơ,物理?216 ơ,预读 7499 ơ?

看来Q用union在通常情况下比用or的效率要高的多?

  但经q试验,W者发现如果or两边的查询列是一L话,那么用union则反倒和用or的执行速度差很多,虽然q里union扫描的是索引Q而or扫描的是全表?
 

select gid,fariqi,neibuyonghu,reader,title from Tgongwen 
          where fariqi=''2004-9-16'' or fariqi=''2004-2-5''

用时Q?423毫秒。扫描计?2Q逻辑?14726 ơ,物理?1 ơ,预读 7176 ơ?/p>

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-9-16'' 
union
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-2-5''

用时Q?1640毫秒。扫描计?8Q逻辑?14806 ơ,物理?108 ơ,预读 1144 ơ?

9、字D|取要按照“需多少、提多少”的原则Q避免“select *?
  我们来做一个试验:

select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc

用时Q?673毫秒

select top 10000 gid,fariqi,title from tgongwen order by gid desc

用时Q?376毫秒

select top 10000 gid,fariqi from tgongwen order by gid desc

用时Q?0毫秒

  由此看来Q我们每提取一个字D,数据的提取速度׃有相应的提升。提升的速度q要看您舍弃的字D늚大小来判断?

10、count(*)不比count(字段)?
  某些资料上说Q用*会统计所有列Q显然要比一个世界的列名效率低。这U说法其实是没有Ҏ的。我们来看:

select count(*) from Tgongwen

用时Q?500毫秒

select count(gid) from Tgongwen 

用时Q?483毫秒

select count(fariqi) from Tgongwen

用时Q?140毫秒

select count(title) from Tgongwen

用时Q?2050毫秒

  从以上可以看出,如果用count(*)和用count(主键)的速度是相当的Q而count(*)却比其他M除主键以外的字段汇总速度要快Q而且字段长Q汇ȝ速度p慢。我惻I如果用count(*)Q?SQL SERVER可能会自动查找最字D|汇ȝ。当Ӟ如果您直接写count(主键)会来的更直接些?

11、order by按聚集烦引列排序效率最?
  我们来看Q(gid是主键,fariqi是聚合烦引列Q:

select top 10000 gid,fariqi,reader,title from tgongwen

用时Q?96 毫秒?扫描计数 1Q逻辑?289 ơ,物理?1 ơ,预读 1527 ơ?/p>

select top 10000 gid,fariqi,reader,title from tgongwen order by gid asc

用时Q?720毫秒?扫描计数 1Q逻辑?41956 ơ,物理?0 ơ,预读 1287 ơ?/p>

select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc

用时Q?736毫秒?扫描计数 1Q逻辑?55350 ơ,物理?10 ơ,预读 775 ơ?/p>

select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi asc

用时Q?73毫秒?扫描计数 1Q逻辑?290 ơ,物理?0 ơ,预读 0 ơ?/p>

select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi desc

用时Q?56毫秒?扫描计数 1Q逻辑?289 ơ,物理?0 ơ,预读 0 ơ?

  从以上我们可以看出,不排序的速度以及逻辑L数都是和“order by 聚集索引列?的速度是相当的Q但q些都比“order by 非聚集烦引列”的查询速度是快得多的?
  同时Q按照某个字D进行排序的时候,无论是正序还是倒序Q速度是基本相当的?

12、高效的TOP
  事实上,在查询和提取大定w的数据集Ӟ影响数据库响应时间的最大因素不是数据查找,而是物理的I/0操作。如Q?

select top 10 * from (
select top 10000 gid,fariqi,title from tgongwen
where neibuyonghu=''办公?'
order by gid desc) as a
order by gid asc

  q条语句Q从理论上讲Q整条语句的执行旉应该比子句的执行旉长,但事实相反。因为,子句执行后返回的?0000条记录,而整条语句仅q回10条语句,所以媄响数据库响应旉最大的因素是物理I/O操作。而限制物理I/O操作此处的最有效Ҏ之一是使用TOP关键词了。TOP关键词是SQL SERVER中经q系l优化过的一个用来提取前几条或前几个癑ֈ比数据的词。经W者在实践中的应用Q发现TOP实很好用,效率也很高。但q个词在另外一个大型数据库ORACLE中却没有Q这不能说不是一个遗憾,虽然在ORACLE中可以用其他ҎQ如QrownumberQ来解决。在以后的关于“实现千万数据的分|C存储过E”的讨论中,我们将用到TOPq个关键词?
  到此为止Q我们上面讨Z如何实现从大定w的数据库中快速地查询出您所需要的数据Ҏ。当Ӟ我们介绍的这些方法都是“Y”方法,在实践中Q我们还要考虑各种“硬”因素,如:|络性能、服务器的性能、操作系l的性能Q甚至网卡、交换机{?

文章引自Q?a >http://www.vckbase.com/document/viewdoc/?id=1308



]]>SQL Server 索引l构及其使用Q一Q?/title><link>http://www.shnenglu.com/ivenher/articles/12162.html</link><dc:creator>爱饭?/dc:creator><author>爱饭?/author><pubDate>Fri, 08 Sep 2006 05:38:00 GMT</pubDate><guid>http://www.shnenglu.com/ivenher/articles/12162.html</guid><wfw:comment>http://www.shnenglu.com/ivenher/comments/12162.html</wfw:comment><comments>http://www.shnenglu.com/ivenher/articles/12162.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/ivenher/comments/commentRss/12162.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ivenher/services/trackbacks/12162.html</trackback:ping><description><![CDATA[ <p> <b>一、深入浅出理解烦引结?/b> <br /> <br />  实际上,您可以把索引理解ZU特D的目录。微软的SQL SERVER提供了两U烦引:聚集索引Qclustered indexQ也U聚cȝ引、簇集烦引)和非聚集索引Qnonclustered indexQ也U非聚类索引、非集索引Q。下面,我们举例来说明一下聚集烦引和非聚集烦引的区别Q?<br />  其实Q我们的汉语字典的正文本w就是一个聚集烦引。比如,我们要查“安”字Q就会很自然地翻开字典的前几页Q因为“安”的拼音是“an”,而按照拼x序汉字的字典是以英文字母“a”开头ƈ以“z”结Q那么“安”字p然地排在字典的前部。如果您d了所有以“a”开头的部分仍然找不到这个字Q那么就说明您的字典中没有这个字Q同LQ如果查“张”字Q那您也会将您的字典d最后部分,因ؓ“张”的拼音是“zhang”。也是_字典的正文部分本w就是一个目录,您不需要再L其他目录来找到您需要找的内宏V我们把q种正文内容本n是一U按照一定规则排列的目录UCؓ“聚集烦引”?<br />  如果您认识某个字Q您可以快速地从自动中查到q个字。但您也可能会遇到您不认识的字,不知道它的发韻Iq时候,您就不能按照刚才的方法找到您要查的字Q而需要去Ҏ“偏旁部首”查到您要找的字Q然后根据这个字后的늠直接d某页来找到您要找的字。但您结合“部首目录”和“检字表”而查到的字的排序q不是真正的正文的排序方法,比如您查“张”字Q我们可以看到在查部首之后的字表中“张”的늠?72,字表中“张”的上面是“驰”字Q但늠却是63,“张”的下面是“徃”字Q页面是390c很昄Q这些字q不是真正的分别位于“张”字的上下方Q现在您看到的连l的“驰、张、徃”三字实际上是他们在非聚集索引中的排序Q是字典正文中的字在非聚集烦引中的映。我们可以通过q种方式来找到您所需要的字,但它需要两个过E,先找到目录中的结果,然后再翻到您所需要的늠。我们把q种目录Ua是目录,正文Ua是正文的排序方式UCؓ“非聚集索引”?<br />  通过以上例子Q我们可以理解到什么是“聚集烦引”和“非聚集索引”。进一步引申一下,我们可以很容易的理解Q每个表只能有一个聚集烦引,因ؓ目录只能按照一U方法进行排序?<br /><br /><b>二、何时用聚集烦引或非聚集烦?/b><br /><br />下面的表ȝ了何时用聚集烦引或非聚集烦引(很重要)Q?</p> <table id="AutoNumber1" style="COLOR: #000000; BORDER-COLLAPSE: collapse" height="107" cellspacing="0" cellpadding="0" width="62%" border="1"> <tbody> <tr> <td align="middle" width="40%" height="23">动作描述</td> <td align="middle" width="29%" height="23">使用聚集索引</td> <td align="middle" width="31%" height="23">使用非聚集烦?/td> </tr> <tr> <td width="40%" height="20">列经常被分组排序</td> <td width="29%" height="20">?/td> <td width="31%" height="20">?/td> </tr> <tr> <td width="40%" height="20">q回某范围内的数?/td> <td width="29%" height="20">?/td> <td width="31%" height="20">不应</td> </tr> <tr> <td width="40%" height="20">一个或极少不同?/td> <td width="29%" height="20">不应</td> <td width="31%" height="20">不应</td> </tr> <tr> <td width="40%" height="20">数目的不同?/td> <td width="29%" height="20">?/td> <td width="31%" height="20">不应</td> </tr> <tr> <td width="40%" height="20">大数目的不同?/td> <td width="29%" height="20">不应</td> <td width="31%" height="20">?/td> </tr> <tr> <td width="40%" height="20">频繁更新的列</td> <td width="29%" height="20">不应</td> <td width="31%" height="20">?/td> </tr> <tr> <td width="40%" height="20">外键?/td> <td width="29%" height="20">?/td> <td width="31%" height="20">?/td> </tr> <tr> <td width="40%" height="20">主键?/td> <td width="29%" height="20">?/td> <td width="31%" height="20">?/td> </tr> <tr> <td width="40%" height="20">频繁修改索引?/td> <td width="29%" height="20">不应</td> <td width="31%" height="20">?/td> </tr> </tbody> </table> <p>  事实上,我们可以通过前面聚集索引和非聚集索引的定义的例子来理解上表。如Q返回某范围内的数据一V比如您的某个表有一个时间列Q恰好您把聚合烦引徏立在了该列,q时您查?004q??日至2004q?0?日之间的全部数据Ӟq个速度将是很快的Q因为您的这本字典正文是按日期进行排序的Q聚cȝ引只需要找到要索的所有数据中的开头和l尾数据卛_Q而不像非聚集索引Q必d查到目录中查到每一Ҏ据对应的늠Q然后再Ҏ늠查到具体内容?<br /><br /><b>三、结合实际,谈烦引用的误区</b><br /><br />  理论的目的是应用。虽然我们刚才列Z何时应用聚集烦引或非聚集烦引,但在实践中以上规则却很容易被忽视或不能根据实际情况进行综合分析。下面我们将Ҏ在实践中遇到的实际问题来谈一下烦引用的误区Q以便于大家掌握索引建立的方法?<br /><br />1、主键就是聚集烦?<br />  q种xW者认为是极端错误的,是对聚集索引的一U浪贏V虽然SQL SERVER默认是在主键上徏立聚集烦引的?<br />  通常Q我们会在每个表中都建立一个ID列,以区分每条数据,q且q个ID列是自动增大的,步长一般ؓ1。我们的q个办公自动化的实例中的列Gid是如此。此Ӟ如果我们这个列设ؓ主键QSQL SERVER会将此列默认集烦引。这样做有好处,是可以让您的数据在数据库中按照IDq行物理排序Q但W者认样做意义不大?<br />  显而易见,聚集索引的优势是很明昄Q而每个表中只能有一个聚集烦引的规则Q这使得聚集索引变得更加珍贵?<br />  从我们前面谈到的聚集索引的定义我们可以看出,使用聚集索引的最大好处就是能够根据查询要求,q速羃查询范_避免全表扫描。在实际应用中,因ؓIDh自动生成的,我们q不知道每条记录的IDP所以我们很隑֜实践中用IDhq行查询。这׃让ID可个主键作集烦引成ZU资源浪贏V其ơ,让每个ID号都不同的字D作集烦引也不符合“大数目的不同值情况下不应建立聚合索引”规则;当然Q这U情况只是针对用L怿改记录内容,特别是烦引项的时候会负作用,但对于查询速度q没有媄响?<br />  在办公自动化pȝ中,无论是系l首|C的需要用L收的文g、会议还是用戯行文件查询等M情况下进行数据查询都M开字段的是“日期”还有用hw的“用户名”?<br />  通常Q办公自动化的首会昄每个用户未{收的文件或会议。虽然我们的where语句可以仅仅限制当前用户未{收的情况,但如果您的系l已建立了很长时_q且数据量很大,那么Q每ơ每个用h开首页的时候都q行一ơ全表扫描,q样做意义是不大的,l大多数的用?个月前的文g都已l浏览过了,q样做只能徒增数据库的开销而已。事实上Q我们完全可以让用户打开pȝ首页Ӟ数据库仅仅查询这个用戯3个月来未阅览的文Ӟ通过“日期”这个字D|限制表扫描,提高查询速度。如果您的办公自动化pȝ已经建立?q_那么您的首页昄速度理论上将是原来速度8倍,甚至更快?<br />  在这里之所以提到“理Z”三字,是因为如果您的聚集烦引还是盲目地建在IDq个主键上时Q您的查询速度是没有这么高的,即您在“日期”这个字D上建立的烦引(非聚合烦引)。下面我们就来看一下在1000万条数据量的情况下各U查询的速度表现Q?个月内的数据?5万条Q: <br /><br />Q?Q仅在主键上建立聚集索引Qƈ且不划分旉D: </p> <pre>Select gid,fariqi,neibuyonghu,title from tgongwen</pre> <p>用时Q?28470毫秒Q即Q?28U) <br /><br />Q?Q在主键上徏立聚集烦引,在fariq上徏立非聚集索引Q?</p> <pre>select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi> dateadd(day,-90,getdate())</pre> <p>用时Q?3763毫秒Q?4U) <br /><br />Q?Q将聚合索引建立在日期列QfariqiQ上Q?</p> <pre>select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi> dateadd(day,-90,getdate())</pre> <p>用时Q?423毫秒Q?U) <br /><br />  虽然每条语句提取出来的都?5万条数据Q各U情늚差异却是巨大的,特别是将聚集索引建立在日期列时的差异。事实上Q如果您的数据库真的?000万容量的话,把主键徏立在ID列上Q就像以上的W??U情况,在网上的表现就是超ӞҎ无法显C。这也是我摒弃ID列作集烦引的一个最重要的因素。得Z上速度的方法是Q在各个select语句前加Q?</p> <pre>declare @d datetime set @d=getdate()</pre> <p>q在select语句后加Q?/p> <pre>select [语句执行p旉(毫秒)]=datediff(ms,@d,getdate())</pre> <p>2、只要徏立烦引就能显著提高查询速度 <br />  事实上,我们可以发现上面的例子中Q第2?条语句完全相同,且徏立烦引的字段也相同;不同的仅是前者在fariqi字段上徏立的是非聚合索引Q后者在此字D上建立的是聚合索引Q但查询速度却有着天壤之别。所以,q是在M字段上简单地建立索引p提高查询速度?<br />  从徏表的语句中,我们可以看到q个有着1000万数据的表中fariqi字段?003个不同记录。在此字D上建立聚合索引是再合适不q了。在现实中,我们每天都会发几个文Ӟq几个文件的发文日期q同,q完全符合徏立聚集烦引要求的Q“既不能l大多数都相同,又不能只有极数相同”的规则。由此看来,我们建立“适当”的聚合索引对于我们提高查询速度是非帔R要的?<br /><br />3、把所有需要提高查询速度的字D都加进聚集索引Q以提高查询速度 <br />  上面已经谈到Q在q行数据查询旉M开字段的是“日期”还有用hw的“用户名”。既然这两个字段都是如此的重要,我们可以把他们合qv来,建立一个复合烦引(compound indexQ?<br />  很多为只要把M字段加进聚集索引Q就能提高查询速度Q也有h感到qhQ如果把复合的聚集烦引字D分开查询Q那么查询速度会减慢吗Q带着q个问题Q我们来看一下以下的查询速度Q结果集都是25万条数据Q:Q日期列fariqi首先排在复合聚集索引的v始列Q用户名neibuyonghu排在后列Q: </p> <pre>Q?Qselect gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>''2004-5-5'' </pre> <p>查询速度Q?513毫秒</p> <pre>Q?Qselect gid,fariqi,neibuyonghu,title from Tgongwen             where fariqi>''2004-5-5'' and neibuyonghu=''办公?'</pre> <p>查询速度Q?516毫秒</p> <pre>Q?Qselect gid,fariqi,neibuyonghu,title from Tgongwen where neibuyonghu=''办公?'</pre> <p>查询速度Q?0280毫秒 <br /><br />  从以上试验中Q我们可以看到如果仅用聚集烦引的起始列作为查询条件和同时用到复合聚集索引的全部列的查询速度是几乎一LQ甚x用上全部的复合烦引列q要略快Q在查询l果集数目一L情况下)Q而如果仅用复合聚集烦引的非v始列作ؓ查询条g的话Q这个烦引是不vM作用的。当Ӟ语句1?的查询速度一h因ؓ查询的条目数一P如果复合索引的所有列都用上,而且查询l果的话,q样׃形成“烦引覆盖”,因而性能可以辑ֈ最优。同Ӟ误住:无论您是否经怋用聚合烦引的其他列,但其前导列一定要是用最频繁的列?<br /><br /><b>四、其他书上没有的索引使用l验ȝ</b><br /><br />1、用聚合索引比用不是聚合索引的主键速度?<br />  下面是实例语句:Q都是提?5万条数据Q?</p> <pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-9-16''</pre> <p>使用旉Q?326毫秒</p> <pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid<=250000</pre> <p>使用旉Q?470毫秒 <br /><br />q里Q用聚合索引比用不是聚合索引的主键速度快了q?/4?<br /><br />2、用聚合索引比用一般的主键作order by旉度快,特别是在数据量情况?</p> <pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by fariqi</pre> <p>用时Q?2936</p> <pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by gid</pre> <p>用时Q?8843 <br /><br />  q里Q用聚合索引比用一般的主键作order byӞ速度快了3/10。事实上Q如果数据量很小的话Q用聚集索引作ؓ排序列要比用非聚集索引速度快得明显的多Q而数据量如果很大的话Q如10万以上,则二者的速度差别不明显?<br /><br />3、用聚合烦引内的时间段Q搜索时间会按数据占整个数据表的癑ֈ比成比例减少Q而无合烦引用了多少个: </p> <pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>''2004-1-1''</pre> <p>用时Q?343毫秒Q提?00万条Q?</p> <pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>''2004-6-6''</pre> <p>用时Q?170毫秒Q提?0万条Q?/p> <pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-9-16''</pre> <p>用时Q?326毫秒Q和上句的结果一模一栗如果采集的数量一P那么用大于号和等于号是一LQ?/p> <pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen             where fariqi>''2004-1-1'' and fariqi<''2004-6-6''</pre> <p>用时Q?280毫秒 <br /><br />4、日期列不会因ؓ有分U的输入而减慢查询速度 <br />  下面的例子中Q共?00万条数据Q?004q??日以后的数据?0万条Q但只有两个不同的日期,日期_到日Q之前有数据50万条Q有5000个不同的日期Q日期精到U?</p> <pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen           where fariqi>''2004-1-1'' order by fariqi</pre> <p>用时Q?390毫秒</p> <pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen             where fariqi<''2004-1-1'' order by fariqi</pre> <p>用时Q?453毫秒 <br /><br /><b>五、其他注意事?/b><br /><br />  “水可蝲舟,亦可覆舟”,索引也一栗烦引有助于提高索性能Q但q多或不当的索引也会Dpȝ低效。因为用户在表中每加q一个烦引,数据库就要做更多的工作。过多的索引甚至会导致烦引碎片?<br />  所以说Q我们要建立一个“适当”的索引体系Q特别是对聚合烦引的创徏Q更应精益求_,以您的数据库能得到高性能的发挥?<br />  当然Q在实践中,作ؓ一个尽职的数据库管理员Q您q要多测试一些方案,扑և哪种Ҏ效率最高、最为有效?<br /><br /><span style="COLOR: red" twffan="done"><p>听棠注:此文章引?a >http://www.vckbase.com/document/viewdoc/?id=1307</a><br /> 感觉W者讲比较透彻Qƈ参考了另一:<a target="_blank">索引的用和优化</a></p><p> 思想基本一致的Qȝ下来Q对日期建立聚集索引比较合适?/p><p> q有一有关索引性能的MS的文章:<a target="_blank" name="indexedviews">使用 <font face="arial">SQL Server 2000</font> 索引视图提高性能</a></p></span></p> <img src ="http://www.shnenglu.com/ivenher/aggbug/12162.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ivenher/" target="_blank">爱饭?/a> 2006-09-08 13:38 <a href="http://www.shnenglu.com/ivenher/articles/12162.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC数据库编E笔讎ͼ一Q?/title><link>http://www.shnenglu.com/ivenher/articles/4917.html</link><dc:creator>爱饭?/dc:creator><author>爱饭?/author><pubDate>Sun, 02 Apr 2006 14:51:00 GMT</pubDate><guid>http://www.shnenglu.com/ivenher/articles/4917.html</guid><wfw:comment>http://www.shnenglu.com/ivenher/comments/4917.html</wfw:comment><comments>http://www.shnenglu.com/ivenher/articles/4917.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/ivenher/comments/commentRss/4917.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ivenher/services/trackbacks/4917.html</trackback:ping><description><![CDATA[ <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"> <span lang="EN-US" style="mso-bidi-font-family: 宋体"> <span style="mso-list: Ignore">一?/span> </span> <span lang="EN-US">VC</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供的数据库讉K技?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"> <span lang="EN-US">ODBC API</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">MFC ODBC</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">DAO</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">OLE DB</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">ADO</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">讉K速度Q传l的</span> <span lang="EN-US">ODBC</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">速度较慢?/span> <span lang="EN-US">OLE DB</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US"> ADO</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都是Z</span> <span lang="EN-US">COM</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">技术,使用该技术可以直接访问数据库的驱动程序,速度大大提高?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?> <o:p> </o:p> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可扩展性:通过</span> <span lang="EN-US">OLE DB</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US"> ActiveX</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">技术,可以利用</span> <span lang="EN-US">VC</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供的各U组Ӟ控g和第三方提供的组建。从而实现应用程序组件化?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <o:p> </o:p> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">讉K不同数据源:传统</span> <span lang="EN-US">ODBC</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只能讉K关系数据库?/span> <span lang="EN-US">VC</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中提?/span> <span lang="EN-US">OLD DB </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">技术可以解册问题?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"> <span lang="EN-US" style="mso-bidi-font-family: 宋体"> <span style="mso-list: Ignore">二?/span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">几种技术概q?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt"> <span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"> <span style="mso-list: Ignore">1?span style="FONT: 7pt 'Times New Roman'">  </span></span> </span> <span lang="EN-US">ODBC API</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供一个通用接口Qؓ</span> <span lang="EN-US">ORACLE</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">SQLSERVER</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都提供了驱动E序。用户可?/span> <span lang="EN-US">SQL</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句Ҏ据库q行直接的底层功能操作。用时应包含以下头文g?/span> <span lang="EN-US">”SQL.H?”SQLEXT.H?”SQLTYPES.H?</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用步骤如下Q?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">W一步:分配</span> <span lang="EN-US">ODBC</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">环境Q初始化一些内部结构。完成该步,需要分配一?/span> <span lang="EN-US">SQLHENV</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">cd的变量在</span> <span lang="EN-US">ODBC</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">环境中做句柄使用?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">W二步:为将要用的每一个数据源分配一个连接句柄,有函?/span> <span lang="EN-US">SQLALLocHandle</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q)完成?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">W三步:使用</span> <span lang="EN-US">SQLConnect</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q)把连接句柄与数据库连接,可以先通过</span> <span lang="EN-US">SQLSetConnectAttr</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q)讄q接属性?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">W四步:q行</span> <span lang="EN-US">SQL</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句操作。操作完可以断开与数据库的连接?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">W五步:释放</span> <span lang="EN-US">ODBC</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">环境?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <o:p> </o:p> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">特点Q功能强大,提供异步操作Q事务处理等高功能。目前所有关pL据库都提供了</span> <span lang="EN-US">ODBC</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的驱动程序,使用很广泛?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">~点Q很难访问对象数据库和非关系数据库?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <o:p> </o:p> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt"> <span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"> <span style="mso-list: Ignore">2?span style="FONT: 7pt 'Times New Roman'">  </span></span> </span> <span lang="EN-US">MFC ODBC</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">c?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <o:p> </o:p> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为简化?/span> <span lang="EN-US">ODBC API</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/span> <span lang="EN-US">VC</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供?/span> <span lang="EN-US">MFC ODBC</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">c,装?/span> <span lang="EN-US">ODBC API</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">主要</span> <span lang="EN-US">MFC ODBC</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">cd下:</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US">CDatabase</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">c:一?/span> <span lang="EN-US">CDatabase</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象表示一个到数据源的q接Q通过它可以操作数据源。一般不需要直接?/span> <span lang="EN-US">CDatabase</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象Q因?/span> <span lang="EN-US">CDecordSet</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象可以实现大多数功能,但在q行事务处理Ӟ</span> <span lang="EN-US">CDatabase</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">pv到关键作用?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US">CRecordSet</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">c:一?/span> <span lang="EN-US">CRecordSet</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象代表一个从数据源选择的一l记录的集合</span> <span lang="EN-US">-----</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">记录集。记录集有两UŞ式:</span> <span lang="EN-US">snapshot</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">dynaset</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。前者表C是静态视图。后者表C录集与其它用户对数据库的更新保持同步?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US">CRecordView</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">c:是在I间中显C数据库记录的视图。这U视图是直接q到一?/span> <span lang="EN-US">CRecordSet</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象的格式视图。他从一个对话框模版资源创徏。ƈ?/span> <span lang="EN-US">CRecordSet</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象的字D|C在对话框模版的控g里。对象利?/span> <span lang="EN-US">DDX</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">RFX</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">机制。格式上的控g和记录集的字D之间数据移动自动化?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US">CDBException</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">c:?/span> <span lang="EN-US">Cexception</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">cL生,?/span> <span lang="EN-US">3</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个承的变量反映Ҏ据库操作时的异常?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <span style="mso-spacerun: yes"> </span>M_nRetCode:<span style="mso-spacerun: yes">  </span>ODBC</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q回码?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US">M_strError: </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字符Ԍ描述造成抛出异常的错误原因?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US">M_strStateNativeOrigin: </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字符Ԍ描述?/span> <span lang="EN-US">ODBC</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">错误码表C的异常错误?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <o:p> </o:p> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt"> <span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"> <span style="mso-list: Ignore">3?span style="FONT: 7pt 'Times New Roman'">  </span></span> </span> <span lang="EN-US">MFC DAO</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <o:p> </o:p> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US">MFC DAO</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是微软提供的用于讉K</span> <span lang="EN-US">Microsoft Jet</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据库文Ӟ</span> <span lang="EN-US">*</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">Mdb</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q的工具。当只需讉K</span> <span lang="EN-US">Access</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据库时用该技术很方便?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt"> <span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"> <span style="mso-list: Ignore">4?span style="FONT: 7pt 'Times New Roman'">  </span></span> </span> <span lang="EN-US">OLE DB</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <o:p> </o:p> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> <span lang="EN-US">ODBC</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">技术类|</span> <span lang="EN-US">OLE DB</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属于数据库访问技术中的底层接口?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">直接使用</span> <span lang="EN-US">OLEDB</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">需要大量代码,</span> <span lang="EN-US">VC</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中提供了</span> <span lang="EN-US">ATL</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模版Q?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US">OLEDB</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框架定义了应用的</span> <span lang="EN-US">3</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个基本类?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <o:p> </o:p> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据提供E序</span> <span lang="EN-US">Data Provider</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">拥有自己的数据ƈ以表格Ş式显C数据的应用E序?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用?/span> <span lang="EN-US">Consumers</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q试?/span> <span lang="EN-US">OLEDB</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口对存储在数据提供E序中对数据q行控制的应用程序?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务提供E序</span> <span lang="EN-US">ServiceProvider</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q是数据提供E序和用者的l合?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <o:p> </o:p> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用</span> <span lang="EN-US">OLE DB</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">~程Ӟ用户使用lg对象开发程序,q些lg包括Q?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">枚D器:用于列出可用的数据源Q?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据源:代表单独的数据和服务提供E序Q用于创建对话;</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对话Q?/span> <span lang="EN-US"> <span style="mso-tab-count: 1">    </span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用于创徏事务和命令;</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">事务Q?/span> <span lang="EN-US"> <span style="mso-tab-count: 1">    </span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用于多个操作归qؓ单一事务处理Q?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">命oQ?/span> <span lang="EN-US"> <span style="mso-tab-count: 1">    </span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用于向数据源发送文本命令(</span> <span lang="EN-US">SQL</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q,q回行集Q?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">错误Q?/span> <span lang="EN-US"> <span style="mso-tab-count: 1">    </span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用于获得错误信息?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt"> <span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"> <span style="mso-list: Ignore">5?span style="FONT: 7pt 'Times New Roman'">  </span></span> </span> <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /?> <st1:city w:st="on"> <st1:place w:st="on"> <span lang="EN-US">ADO</span> </st1:place> </st1:city> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <o:p> </o:p> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US">ADO</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">技术是Z</span> <span lang="EN-US">OLE DB</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的访问接口。承了</span> <span lang="EN-US">OLEDB</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的优点,q对</span> <span lang="EN-US">OLEDB</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的接口作了封装,定义?/span> <span lang="EN-US">ADO</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象Q开发简化?/span> <span lang="EN-US">ADO</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属于数据库访问的高层接口?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <o:p> </o:p> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US">ADO</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在服务器应用斚w非常有效Q特别是动态服务器面Q?/span> <span lang="EN-US">ASP</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q的支持?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <o:p> </o:p> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US">ADO</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象l构cM?/span> <span lang="EN-US">OLEDB</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q但q不依靠对象层次。大多数情况用户只需创徏q用需要的对象。下面的对象cȝ成了</span> <span lang="EN-US">ADO</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US"> <o:p> </o:p> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US">Connection</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/span> <span lang="EN-US"> <span style="mso-tab-count: 1">  </span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用于表示与数据库的连接,以及处理一些事务和命o?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US">Command</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/span> <span lang="EN-US"> <span style="mso-tab-count: 1">   </span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用于处理传送给数据源的命o?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US">Recordset</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/span> <span lang="EN-US"> <span style="mso-tab-count: 1">   </span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用于处理数据的表格集Q?/span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包括获取和修Ҏ据?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US">Field</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/span> <span lang="EN-US"> <span style="mso-tab-count: 2">           </span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用于表示记录集中的列信息Q包括列值和其他信息?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US">Parameter</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/span> <span lang="EN-US"> <span style="mso-tab-count: 1">   </span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在传送给数据源的命o之间传递数据?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US">Property</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/span> <span lang="EN-US"> <span style="mso-tab-count: 1">     </span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用于操作?/span> <span lang="EN-US">ADO</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中用的其它对象的详l属性?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US">Errro</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/span> <span lang="EN-US"> <span style="mso-tab-count: 2">          </span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用于获取可能发生的详l错误信息?/span> </p> <img src ="http://www.shnenglu.com/ivenher/aggbug/4917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ivenher/" target="_blank">爱饭?/a> 2006-04-02 22:51 <a href="http://www.shnenglu.com/ivenher/articles/4917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sybase 数据源徏?/title><link>http://www.shnenglu.com/ivenher/articles/1011.html</link><dc:creator>爱饭?/dc:creator><author>爱饭?/author><pubDate>Wed, 09 Nov 2005 08:19:00 GMT</pubDate><guid>http://www.shnenglu.com/ivenher/articles/1011.html</guid><wfw:comment>http://www.shnenglu.com/ivenher/comments/1011.html</wfw:comment><comments>http://www.shnenglu.com/ivenher/articles/1011.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/ivenher/comments/commentRss/1011.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ivenher/services/trackbacks/1011.html</trackback:ping><description><![CDATA[1、打开Sybase ASE OLE DB Congiguraton Manager.<BR>新徏一个datasource取名ssa<BR><IMG height=503 alt="sybase datasource.JPG" src="http://www.shnenglu.com/images/cppblog_com/ivenher/sybase%20datasource.JPG" width=512 border=0><BR><BR>server name为机器名字。database name 为数据库名。其他默认?BR>然后?Test Connect试是否成功?BR><IMG height=384 alt="connect test.JPG" src="http://www.shnenglu.com/images/cppblog_com/ivenher/connect%20test.JPG" width=512 border=0><BR><BR>提示成功?img src ="http://www.shnenglu.com/ivenher/aggbug/1011.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ivenher/" target="_blank">爱饭?/a> 2005-11-09 16:19 <a href="http://www.shnenglu.com/ivenher/articles/1011.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ALTER TABLE http://www.shnenglu.com/ivenher/articles/829.html爱饭?/dc:creator>爱饭?/author>Mon, 24 Oct 2005 09:22:00 GMThttp://www.shnenglu.com/ivenher/articles/829.htmlhttp://www.shnenglu.com/ivenher/comments/829.htmlhttp://www.shnenglu.com/ivenher/articles/829.html#Feedback0http://www.shnenglu.com/ivenher/comments/commentRss/829.htmlhttp://www.shnenglu.com/ivenher/services/trackbacks/829.html
ALTER TABLE
 

  通过更改、添加、除d和约束,或者通过启用或禁用约束和触发器来更改表的定义?BR>  
  语法
  ALTER TABLE table
  { [ ALTER COLUMN column_name
   { new_data_type [ ( precision [ , scale ] ) ]
   [ COLLATE < collation_name > ]
   [ NULL | NOT NULL ]
   | {ADD | DROP } ROWGUIDCOL }
   ]
   | ADD
   { [ < column_definition > ]
   | column_name AS computed_column_expression
   } [ ,...n ]
   | [ WITH CHECK | WITH NOCHECK ] ADD
   { < table_constraint > } [ ,...n ]
   | DROP
   { [ CONSTRAINT ] constraint_name
   | COLUMN column } [ ,...n ]
   | { CHECK | NOCHECK } CONSTRAINT
   { ALL | constraint_name [ ,...n ] }
   | { ENABLE | DISABLE } TRIGGER
   { ALL | trigger_name [ ,...n ] }
  }
  
  < column_definition > ::=
   { column_name data_type }
   [ [ DEFAULT constant_expression ] [ WITH VALUES ]
   | [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
   ]
   [ ROWGUIDCOL ]
   [ COLLATE < collation_name > ]
   [ < column_constraint > ] [ ...n ]
  
  < column_constraint > ::=
   [ CONSTRAINT constraint_name ]
   { [ NULL | NOT NULL ]
   | [ { PRIMARY KEY | UNIQUE }
   [ CLUSTERED | NONCLUSTERED ]
   [ WITH FILLFACTOR = fillfactor ]
   [ ON { filegroup | DEFAULT } ]
   ]
   | [ [ FOREIGN KEY ]
   REFERENCES ref_table [ ( ref_column ) ]
   [ ON DELETE { CASCADE | NO ACTION } ]
   [ ON UPDATE { CASCADE | NO ACTION } ]
   [ NOT FOR REPLICATION ]
   ]
   | CHECK [ NOT FOR REPLICATION ]
   ( logical_expression )
   }
  
  < table_constraint > ::=
   [ CONSTRAINT constraint_name ]
   { [ { PRIMARY KEY | UNIQUE }
   [ CLUSTERED | NONCLUSTERED ]
   { ( column [ ,...n ] ) }
   [ WITH FILLFACTOR = fillfactor ]
   [ ON { filegroup | DEFAULT } ]
   ]
   | FOREIGN KEY
   [ ( column [ ,...n ] ) ]
   REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
   [ ON DELETE { CASCADE | NO ACTION } ]
   [ ON UPDATE { CASCADE | NO ACTION } ]
   [ NOT FOR REPLICATION ]
   | DEFAULT constant_expression
   [ FOR column ] [ WITH VALUES ]
   | CHECK [ NOT FOR REPLICATION ]
   ( search_conditions )
   }
  
  参数
  table
  
  是要更改的表的名U。如果表不在当前数据库中或者不属于当前用户所拥有Q可以显式指定数据库和所有者?BR>  
  ALTER COLUMN
  
  指定要更改给定列。如果兼容别是 65 或小?65Q将不允怋?ALTER COLUMN?BR>  要更改的列不能是Q?
  
  数据cd?text、image、ntext ?timestamp 的列?BR>  
  
  表的 ROWGUIDCOL 列?BR>  
  
  计算列或用于计算列中的列?BR>  
  
  被复制列?BR>  
  
  用在索引中的列,除非该列数据cd?varchar、nvarchar ?varbinaryQ数据类型没有更改,而且新列大小{于或者大于旧列大?BR>  
  
  用在?CREATE STATISTICS 语句创徏的统计中的列。首先用 DROP STATISTICS 语句删除l计。由查询优化器自动生成的l计会由 ALTER COLUMN 自动除去?BR>  
  
  用在 PRIMARY KEY ?[FOREIGN KEY] REFERENCES U束中的列?BR>  
  
  用在 CHECK ?UNIQUE U束中的列,除非用在 CHECK ?UNIQUE U束中的可变长度列的长度允许更改?BR>  
  
  有相兌的默认值的列,除非在不更改数据cd的情况下允许更改列的长度、精度或数位数?
  有些数据cd的更改可能导致数据的更改。例如,数据类型ؓ nchar ?nvarchar 的列更改?char ?varchar cdQ将D扩展字符的{换。降低列的精度和数位数可能D数据截断?BR>  column_name
  
  是要更改、添加或除去的列的名U。对于新列,如果数据cd?timestampQcolumn_name 可以省略。对?timestamp 数据cd的列Q如果未指定 column_nameQ将使用名称 timestamp?BR>  
  new_data_type
  
  是要更改的列的新数据cd。要更改的列?new_data_type 应符合下列准则:
  
  原来的数据类型必d以隐式{换ؓ新数据类型?BR>  
  
  new_data_type cd不能?timestamp?BR>  
  
  ?ALTER COLUMNQANSI I默认值始l打开Q如果没有指定,列将可ؓI?BR>  
  
  ?ALTER COLUMNQANSI 填充始终打开?BR>  
  
  如果要更改的列是标识列,new_data_type 必须是支持标识属性的数据cd?BR>  
  
  忽?SET ARITHABORT 的当前设|。ALTER TABLE 语句的行为如?ARITHABORT 选项?ON 时一栗?
  precision
  
  是指定数据类型的_ֺ?BR>  scale
  
  是指定数据类型的数位数?BR>  COLLATE < collation_name >
  
  为更改列指定新的排序规则。排序规则名U既可以?Windows 排序规则名称Q也可以?SQL 排序规则名称?BR>  COLLATE 子句只能用于更改数据cd?char、varchar、text、nchar、nvarchar ?ntext 的列的排序规则。如果未指定Q则此列采用数据库的默认排序规则?BR>  
  若满下列条Ӟ?ALTER COLUMN 不能更改排序规则Q?
  
  查约束、外键约束或计算列引用了更改列?
  
  
  在此列上创徏了烦引、统计或全文索引。更改列的排序规则时Q该列上自动创徏的统计将除去?BR>  
  
  SCHEMABOUND 视图或函数引用了此列?
  NULL | NOT NULL
  
  指定该列是否可接受空倹{不允许I值的列只有在指定了默认值的情况下,才能?ALTER TABLE 语句向表中添加。添加到表中的新列要么允许空|要么必须指定默认倹{?BR>  
  如果新列允许I|而且没有指定默认|那么新列在表中每一行都包含I倹{如果新列允许空值ƈ且指定了新列的默认|那么可以使用 WITH VALUES 选项在表中所有现有行的新列中存储默认倹{?BR>  
  如果新列不允许空|那么新列必须h DEFAULT 定义Q而且新列的所有现有行中将自动装蝲该默认倹{?BR>  
  可在 ALTER COLUMN 语句中指?NULL 以 NOT NULL 列允许空|?PRIMARY KEY U束中的列除外。只有列中不包含I值时QALTER COLUMN 中才可指?NOT NULL。必dI值更Cؓ非空值后Q才允许执行 ALTER COLUMN NOT NULL 语句Q比如:
  
  UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL
  
  ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR(20) NOT NULL
  
  如果 ALTER COLUMN 中指定了 NULL ?NOT NULLQ那么必d时指?new_data_type [(precision [, scale ])]。如果不更改数据cd、精度和数位数Q请指定列的q些值的当前倹{?BR>  
  [ {ADD | DROP} ROWGUIDCOL ]
  
  指定在指定列上添加或除去 ROWGUIDCOL 属性。ROWGUIDCOL 是一个关键字Q表C列是行全局唯一标识W列。对于每个表只能指派一?uniqueidentifier 列作?ROWGUIDCOL 列。ROWGUIDCOL 属性只能指z uniqueidentifier 列?BR>  
  ROWGUIDCOL 属性ƈ不强制列中所存储值的唯一性。该属性也不会为插入到表中的新行自动生成倹{若要ؓ每列生成唯一|那么或者在 INSERT 语句中?NEWID 函数Q或者将 NEWID 函数指定列的默认倹{?BR>  
  ADD
  
  指定要添加一个或多个列定义、计列定义或者表U束?BR>  
  computed_column_expression
  
  是一个定义计列的值的表达式。计列是ƈ不物理地存储在表中的虚拟列,该列用表辑ּ计算得出Q该表达式用同一表中的其它列。例如,计算列的定义可以是:cost AS price * qty。表辑ּ可以是非计算列的列名、常量、函数、变量,也可以是用一个或多个q算W连接的上述元素的Q意组合。表辑ּ不能为子查询?BR>  
  计算列可用于选择列表、WHERE 子句、ORDER BY 字句或其它Q何可以用常规表辑ּ的位|,但下列情况除外:
  
  计算列不能用?DEFAULT ?FOREIGN KEY U束定义Q也不能?NOT NULL U束定义一起用。但是,如果计算列由h定性的表达式定义,q且索引列中允许计算l果的数据类型,则可该列用作烦引中的键列,或用?PRIMARY KEY ?UNIQUE U束的一部分?
  例如Q如果表中有整数?a ?bQ那么计列 a+b 上可建立索引Q而计列 a+DATEPART(dd, GETDATE()) 上则不能Q因值将在后l调用时更改?BR>  
  计算列不能作?INSERT ?UPDATE 语句的目标?
  
  
  说明 ׃表中计算列所用列中的各行可能有不同的|所以计列的每一行可能有不同的倹{?BR>  
  n
  
  是表C前面的可重复 n ơ的占位W?BR>  
  WITH CHECK | WITH NOCHECK
  
  指定表中的数据是否用新添加的或重新启用的 FOREIGN KEY ?CHECK U束q行验证。如果没有指定,对于新约束,假定?WITH CHECKQ对于重新启用的U束Q假定ؓ WITH NOCHECK?BR>  
  WITH CHECK ?WITH NOCHECK 子句不能用于 PRIMARY KEY ?UNIQUE U束?BR>  
  如果不想用新 CHECK ?FOREIGN KEY U束对现有数据进行验证,L WITH NOCHECKQ除了个别情况,不徏议这样用。新U束在以后的所有更C生效。Q何在dU束时由 WITH NOCHECK 抑制的约束违规都可能D来的更新失败,如果q些更新操作要更新的行中包含不符合约束条件的数据?BR>  
  查询优化器不考虑?WITH NOCHECK 定义的约束。将忽略q些U束Q直C?ALTER TABLE table CHECK CONSTRAINT ALL语句重新启用q些U束为止?BR>  
  DROP { [CONSTRAINT] constraint_name | COLUMN column_name }
  
  指定从表中删?constraint_name 或?column_name。如果兼容别小于或{于 65Q将不允?DROP COLUMN。可以列出多个列或约束。下面的列不能除去:
  
  被复制列?BR>  
  
  用在索引中的列?BR>  
  
  用在 CHECK、FOREIGN KEY、UNIQUE ?PRIMARY KEY U束中的列?BR>  
  
  有相兌的默认|?DEFAULT 关键字定义)的列Q或l定到默认对象的列?BR>  
  
  l定到规则的列?
  { CHECK | NOCHECK} CONSTRAINT
  
  指定启用或禁?constraint_name。如果禁用,来插入或更新该列时不用该U束条gq行验证。此选项只能?FOREIGN KEY ?CHECK U束一起用?
  
  ALL
  指定使用 NOCHECK 选项用所有约束,或者?CHECK 选项启用所有约束?
  {ENABLE | DISABLE} TRIGGER
  
  指定启用或禁?trigger_name。当一个触发器被禁用时Q它对表的定义依然存在;然而,当在表上执行 INSERT、UPDATE ?DELETE 语句Ӟ触发器中的操作将不执行,除非重新启用该触发器?
  
  ALL
  指定启用或禁用表中所有的触发器?BR>  
  trigger_name
  指定要启用或用的触发器名称?
  column_name data_type
  
  新列的数据类型。data_type 可以是Q?Microsoft] SQL Server?数据cd或用户定义数据类型?BR>  
  DEFAULT
  
  是指定列默认值的关键字。DEFAULT 定义可用于ؓ表中现有行的新列提供倹{DEFAULT 定义不能d到具?timestamp 数据cd、IDENTITY 属性、现?DEFAULT 定义或绑定默认值的列。如果列已有默认|必须除去旧默认值后才能d新默认倹{ؓ?SQL Server 先前版本保持兼容性,?DEFAULT 赋予U束名是可能的?BR>  
  IDENTITY
  
  指定新列是标识列。在表中d新行ӞSQL Server 为列提供一个唯一的增量倹{标识列通常?PRIMARY KEY U束一L作表的唯一行标识符。IDENTITY 属性可赋予 tinyint、smallint、int、bigint、decimal(p,0) 或?numeric(p,0) 列。对于每个表只能创徏一个标识列。DEFAULT 关键字和l定默认g能用于标识列。要么种子和增量都同时指定,要么都不指定。如果二者都未指定,则取默认?(1,1)?
  
  Seed
  是用于表中所装蝲的第一行的倹{?BR>  
  Increment
  是添加到前一行的标识值的增量倹{?
  NOT FOR REPLICATION
  
  指定当复制登录(?sqlreplQ向表中插入数据Ӟ不强?IDENTITY 属性。也可对U束指定 NOT FOR REPLICATION。当复制d向表中插入数据时Q不查约束条件?BR>  
  CONSTRAINT
  
  指定 PRIMARY KEY、UNIQUE、FOREIGN KEY ?CHECK U束的开始,或者指?DEFAULT 定义的开始?BR>  
  constrain_name
  
  是新U束。约束的名称必须W合标识W规则,但其名称的首字符不能?#。如果没有提?constraint_nameQ约束用系l生成的名称?BR>  
  PRIMARY KEY
  
  是通过唯一索引对给定的一列或多列强制实体完整性的U束。对每个表只能创Z?PRIMARY KEY U束?BR>  
  UNIQUE
  
  是通过唯一索引为给定的一列或多列提供实体完整性的U束?BR>  
  CLUSTERED | NONCLUSTERED
  
  指定?PRIMARY KEY ?UNIQUE U束创徏聚集或非聚集索引。PRIMARY KEY U束默认?CLUSTEREDQUNIQUE U束默认?NONCLUSTERED?BR>  
  如果表中已存在聚集约束或索引Q那么在 ALTER TABLE 中就不能指定 CLUSTERED。如果表中已存在聚集U束或烦引,PRIMARY KEY U束默认?NONCLUSTERED?BR>  
  WITH FILLFACTOR = fillfactor
  
  指定 SQL Server 存储索引数据时每个烦引页的充满程度。用h定的 fillfactor 取D围从 1 ?100。如果没有指定,那么默认gؓ 0。创建烦引时Qfillfactor D低,不必分配新空间即可添加的新烦引条目的可用I间p多?BR>  
  ON {filegroup | DEFAULT}
  
  指定为约束创建的索引的存储位|。如果指定了 filegroupQ烦引将在该文gl内创徏。如果指定了 DEFAULTQ烦引将在默认文件组内创建。如果未指定 ONQ烦引将在表所在的文gl内创徏。当?PRIMARY KEY ?UNIQUE U束d聚集索引Ӟ如果指定?ONQ那么创集烦引时整个表都移到指定的文gl中?BR>  
  在这里,DEFAULT 不是一个关键字。DEFAULT 是默认文件组的标识符Q必ȝW号界定Q如 ON "DEFAULT" ?ON [DEFAULT]?BR>  
  FOREIGN KEY...REFERENCES
  
  是ؓ列中数据提供引用完整性的U束。FOREIGN KEY U束要求列中的每个值在被引用表的指定列中都存在?BR>  
  ref_table
  
  ?FOREIGN KEY U束所引用的表?BR>  
  ref_column
  
  是新 FOREIGN KEY U束所引用的一列或多列Q置于括号中Q?BR>  
  ON DELETE {CASCADE | NO ACTION}
  
  指定当表中被更改的行h引用关系Qƈ且该行所引用的行从父表中删除Ӟ要对被更改行采取的操作。默认设|ؓ NO ACTION?
  
  如果指定 CASCADEQ则从父表中删除被引用行Ӟ也将从引用表中删除引用行。如果指?NO ACTIONQSQL Server 生一个错误ƈ回滚父表中的行删除操作?BR>  
  如果表中已存?ON DELETE ?INSTEAD OF 触发器,那么׃能定?ON DELETE 的CASCADE 操作?BR>  
  例如Q在 Northwind 数据库中QOrders 表和 Customers 表之间有引用关系。Orders.CustomerID 外键引用 Customers.CustomerID 主键?BR>  
  如果?Customers 表的某行执行 DELETE 语句Qƈ且ؓ Orders.CustomerID 指定 ON DELETE CASCADE 操作Q则 SQL Server 在 Orders 表中查是否有与被删除的行相关的一行或多行。如果存在相兌Q那?Orders 表中的相兌随 Customers 表中的被引用行一同删除?BR>  
  反之Q如果指?NO ACTIONQ若?Orders 表中臛_有一行引?Customers 表中要删除的行,?SQL Server 生一个错误ƈ回滚 Customers 表中的删除操作?BR>  
  ON UPDATE {CASCADE | NO ACTION}
  
  指定当表中被更改的行h引用关系Qƈ且该行所引用的行在父表中更新Ӟ要对被更改行采取的操作。默认设|ؓ NO ACTION?
  
  如果指定 CASCADEQ则在父表中更新被引用行Ӟ也将在引用表中更新引用行。如果指?NO ACTIONQSQL Server 生一个错误ƈ回滚父表中的行更新操作?BR>  
  如果表中已存?ON DELETE ?INSTEAD OF 触发器,那么׃能定?ON DELETE 的CASCADE 操作?BR>  
  例如Q在 Northwind 数据库中QOrders 表和 Customers 表之间有引用关系。Orders.CustomerID 外键引用 Customers.CustomerID 主键?BR>  
  如果?Customers 表的某行执行 UPDATE 语句Qƈ且ؓ Orders.CustomerID 指定 ON UPDATE CASCADE 操作Q则 SQL Server 在 Orders 表中查是否有与被更新行相关的一行或多行。如果存在相兌Q那?Orders 表中的相兌随 Customers 表中的被引用行一同更新?BR>  
  反之Q如果指定了 NO ACTIONQ若?Orders 表中臛_存在一行引?Customers 表中要更新的行,那么 SQL Server 引发一个错误ƈ回滚 Customers 表中的更新操作?BR>  
  [ASC | DESC]
  
  指定加入到表U束中的一列或多列的排序次序。默认设|ؓ ASC?BR>  
  WITH VALUES
  
  指定在添加到现有行的新列中存?DEFAULT constant_expression 中所l定的倹{只有在 ADD 列子句中指定?DEFAULT 的情况下Q才能?WITH VALUES。如果要d的列允许Ig指定?WITH VALUESQ那么将在现有行的新列中存储默认倹{如果没有指?WITH VALUES 且列允许I|那么在现有行的新列中存?NULL 倹{如果新列不允许I|那么不论是否指定 WITH VALUESQ都在现有行的新列中存储默认倹{?BR>  
  column[,...n]
  
  是新U束所用的一列或多列Q置于括号中Q?BR>  
  constant_expression
  
  是用作列的默认值的字面倹{NULL 或者系l函数?BR>  
  FOR column
  
  指定与表U?DEFAULT 定义相关联的列?BR>  
  CHECK
  
  是通过限制可输入到一列或多列中的可能值强制域完整性的U束?BR>  
  logical_expression
  
  是用?CHECK U束的返?TRUE ?FALSE 的逻辑表达式。用?CHECK U束?Logical_expression 不能引用其它表,但可引用同一表中同一行的其它列?BR>  
  注释
  若要d新数据行Q请使用 INSERT 语句。若要删除数据行Q请使用 DELETE ?TRUNCATE TABLE 语句。若要更改现有行中的|请?UPDATE 语句?BR>  
  ALTER TABLE 语句指定的更改将立即实现。如果这些更攚w要修改表中的行,ALTER TABLE 更新这些行。ALTER TABLE 获取表上的架构修改锁,以确保在更改期间其它q接不能引用该表Q甚至不能引用其元数据)。对表进行的更改记录于日志中,q且可以完全恢复。媄响非常大的表中所有行的更改,比如除去一列或者用默认值添?NOT NULL 列,可能需要较长时间才能完成,q会生成大量日志记录。如同媄响大量行?INSERT、UPDATE 或?DELETE 语句一Pq一c?ALTER TABLE 语句也应心使用?BR>  
  如果q程高速缓存中存在引用该表的执行计划,ALTER TABLE 会将q些执行计划标记Zơ执行时重新~译?BR>  
  如果 ALTER TABLE 语句指定更改其它表所引用的列|那么Ҏ引用表中 ON UPDATE 或?ON DELETE 所指定的操作,发生以下两个事件之一?
  
  如果在引用表中没有指定值或指定?NO ACTIONQ默认|Q那?ALTER TABLE 语句D的更改父表中被引用列的操作将回滚Qƈ?SQL Server 引发一个错误?BR>  
  
  如果在引用表中指定了 CASCADEQ那么由 ALTER TABLE 语句D的对父表的更改将应用于父表及其相兌?
  d sql_variant 列的 ALTER TABLE 语句会生成下列警告:
  
  The total row size (xx) for table 'yy' exceeds the maximum number of bytes per row (8060). Rows that exceed the maximum number of bytes will not be added.
  因ؓ sql_variant 的最大长度ؓ 8016 个字节,所以生该警告。当?sql_variant 列所含值接q最大长度时Q即会超q行长度的最大字节限制?BR>  
  ALTER TABLE 语句对具有架构绑定视囄表执行时Q所受限制与当前在更改具有简单烦引的表时所受的限制相同。添加列是允许的。但是,不允许删除或更改参与架构l定视图的表中的列。如?ALTER TABLE 语句要求更改用在架构l定视图中的列,更改操作失败,q且 SQL Server 引发一条错误信息。有?SCHEMABINDING 和烦引视囄更多信息Q请参见 CREATE VIEW?BR>  
  创徏引用表的架构l定视图不会影响在基表上d或删除触发器?BR>  
  当除ȝ束时Q作为约束的一部分而创建的索引也将除去。而通过 CREATE INDEX 创徏的烦引必M?DROP INDEX 语句来除厅RDBCC DBREINDEX 语句可用来重建约束定义的索引部分Q而不必?ALTER TABLE 先除d重新dU束?BR>  
  必须删除所有基于列的烦引和U束后,才能删除列?BR>  
  dU束Ӟ所有现有数据都要进行约束违规验证。如果发生违规,ALTER TABLE 语句失败ƈq回一个错误?BR>  
  当在现有列上d?PRIMARY KEY ?UNIQUE U束Ӟ该列中的数据必须唯一。如果存在重复|ALTER TABLE 语句失败。当d PRIMARY KEY ?UNIQUE U束ӞWITH NOCHECK 选项不v作用?BR>  
  每个 PRIMARY KEY ?UNIQUE U束都将生成一个烦引。UNIQUE ?PRIMARY KEY U束的数目不能导致表上非聚集索引的数目大?249Q聚集烦引的数目大于 1?BR>  
  如果要添加的列的数据cd?uniqueidentifierQ那么该列可以?NEWID() 函数作ؓ默认|以向表中现有行的新列提供唯一标识W倹{?BR>  
  SQL Server 在列定义中ƈ不强制以特定的顺序指?DEFAULT、IDENTITY、ROWGUIDCOL 或列U束?BR>  
  ALTER TABLE ?ALTER COLUMN 子句q不会在列上l定或取消绑定Q何规则。必d别?sp_bindrule ?sp_unbindrule 来绑定或取消l定规则?BR>  
  可将规则l定到用户定义数据类型。然?CREATE TABLE 自动在以该用户定义数据cd定义的列上绑定该规则。当?ALTER COLUMN 更改列数据类型时Qƈ不会取消l定q些规则。原用户定义数据cd上的规则仍然l定在该列上。在 ALTER COLUMN 更改了列的数据类型之后,随后执行的Q何从该用户定义数据类型上取消l定规则?sp_unbindrule 都不会导致从更改了数据类型的列上取消l定该规则。如?ALTER COLUMN 列的数据类型更改ؓl定了规则的用户定义数据cdQ那么绑定到新数据类型的规则不会l定到该列?BR>  
  权限
  ALTER TABLE 权限默认授予表的所有者、sysadmin 固定服务器角色成员、db_owner ?db_ddladmin 固定数据库角色成员且不可转让?BR>  
  CZ
  A. 更改表以d新列
  下例d一个允许空值的列,而且没有通过 DEFAULT 定义提供倹{各行的新列中的值将?NULL?BR>  
  CREATE TABLE doc_exa ( column_a INT)
  GO
  ALTER TABLE doc_exa ADD column_b VARCHAR(20) NULL
  GO
  EXEC sp_help doc_exa
  GO
  DROP TABLE doc_exa
  GO
  
  B. 更改表以除去?BR>  下例修改表以删除一列?BR>  
  CREATE TABLE doc_exb ( column_a INT, column_b VARCHAR(20) NULL)
  GO
  ALTER TABLE doc_exb DROP COLUMN column_b
  GO
  EXEC sp_help doc_exb
  GO
  DROP TABLE doc_exb
  GO
  
  C. 更改表以dhU束的列
  下例向表中添加具?UNIQUE U束的新列?
  
  CREATE TABLE doc_exc ( column_a INT)
  GO
  ALTER TABLE doc_exc ADD column_b VARCHAR(20) NULL
   CONSTRAINT exb_unique UNIQUE
  GO
  EXEC sp_help doc_exc
  GO
  DROP TABLE doc_exc
  GO
  
  D. 更改表以d未验证的U束
  下例向表中的现有列上dU束。该列中存在一个违反约束的|因此Q利?WITH NOCHECK 来防止对现有行验证约束,从而允许该U束的添加?BR>  
  CREATE TABLE doc_exd ( column_a INT)
  GO
  INSERT INTO doc_exd VALUES (-1)
  GO
  ALTER TABLE doc_exd WITH NOCHECK
  ADD CONSTRAINT exd_check CHECK (column_a > 1)
  GO
  EXEC sp_help doc_exd
  GO
  DROP TABLE doc_exd
  GO
  
  E. 更改表以d多个带有U束的列
  下例向表中添加多个带有约束的新列。第一个新列具?IDENTITY 属性;表中每一行的标识列都具有递增的新倹{?BR>  
  CREATE TABLE doc_exe ( column_a INT CONSTRAINT column_a_un UNIQUE)
  GO
  ALTER TABLE doc_exe ADD
  
  /* Add a PRIMARY KEY identity column. */
  column_b INT IDENTITY
  CONSTRAINT column_b_pk PRIMARY KEY,
  
  /* Add a column referencing another column in the same table. */
  column_c INT NULL
  CONSTRAINT column_c_fk
  REFERENCES doc_exe(column_a),
  
  /* Add a column with a constraint to enforce that */
  /* nonnull data is in a valid phone number format. */
  column_d VARCHAR(16) NULL
  CONSTRAINT column_d_chk
  CHECK
  (column_d IS NULL OR
  column_d LIKE "[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]" OR
  column_d LIKE
  "([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]"),
  
  /* Add a nonnull column with a default. */
  column_e DECIMAL(3,3)
  CONSTRAINT column_e_default
  DEFAULT .081
  GO
  EXEC sp_help doc_exe
  GO
  DROP TABLE doc_exe
  GO
  
  F. dh默认值的可ؓI的?BR>  下例d可ؓI的、具?DEFAULT 定义的列Qƈ使用 WITH VALUES 中的各现有行提供倹{如果没有?WITH VALUESQ那么每一行的新列中都具?NULL 倹{?BR>  
  ALTER TABLE MyTable
  ADD AddDate smalldatetime NULL
  CONSTRAINT AddDateDflt
  DEFAULT getdate() WITH VALUES
  
  G. 用q新启用一个约?BR>  下例用用于限制可接受的薪水数据的约束。WITH NOCHECK CONSTRAINT ?ALTER TABLE 一起用,以禁用该U束q正常情况下会引vU束q规的插入操作得以执行。WITH CHECK CONSTRAINT 重新启用该约束?BR>  
  CREATE TABLE cnst_example
  (id INT NOT NULL,
   name VARCHAR(10) NOT NULL,
   salary MONEY NOT NULL
   CONSTRAINT salary_cap CHECK (salary < 100000)
  )
  
  -- Valid inserts
  INSERT INTO cnst_example VALUES (1,"Joe Brown",65000)
  INSERT INTO cnst_example VALUES (2,"Mary Smith",75000)
  
  -- This insert violates the constraint.
  INSERT INTO cnst_example VALUES (3,"Pat Jones",105000)
  
  -- Disable the constraint and try again.
  ALTER TABLE cnst_example NOCHECK CONSTRAINT salary_cap
  INSERT INTO cnst_example VALUES (3,"Pat Jones",105000)
  
  -- Reenable the constraint and try another insert, will fail.
  ALTER TABLE cnst_example CHECK CONSTRAINT salary_cap
  INSERT INTO cnst_example VALUES (4,"Eric James",110000)
  
  H. 用q新启用触发器
  下例使用 ALTER TABLE ?DISABLE TRIGGER 选项来禁用触发器Q以使正常情况下会违反触发器条g的插入操作得以执行。然后下例?ENABLE TRIGGER 重新启用触发器?BR>  
  CREATE TABLE trig_example
  (id INT,
  name VARCHAR(10),
  salary MONEY)
  go
  -- Create the trigger.
  CREATE TRIGGER trig1 ON trig_example FOR INSERT
  as
  IF (SELECT COUNT(*) FROM INSERTED
  WHERE salary > 100000) > 0
  BEGIN
  print "TRIG1 Error: you attempted to insert a salary > $100,000"
  ROLLBACK TRANSACTION
  END
  GO
  -- Attempt an insert that violates the trigger.
  INSERT INTO trig_example VALUES (1,"Pat Smith",100001)
  GO
  -- Disable the trigger.
  ALTER TABLE trig_example DISABLE TRIGGER trig1
  GO
  -- Attempt an insert that would normally violate the trigger
  INSERT INTO trig_example VALUES (2,"Chuck Jones",100001)
  GO
  -- Re-enable the trigger.
  ALTER TABLE trig_example ENABLE TRIGGER trig1
  GO
  -- Attempt an insert that violates the trigger.
  INSERT INTO trig_example VALUES (3,"Mary Booth",100001)
  GO
  


]]>
初学T-SQLW记之ON[PRIMARY]http://www.shnenglu.com/ivenher/articles/828.html爱饭?/dc:creator>爱饭?/author>Mon, 24 Oct 2005 08:57:00 GMThttp://www.shnenglu.com/ivenher/articles/828.htmlhttp://www.shnenglu.com/ivenher/comments/828.htmlhttp://www.shnenglu.com/ivenher/articles/828.html#Feedback0http://www.shnenglu.com/ivenher/comments/commentRss/828.htmlhttp://www.shnenglu.com/ivenher/services/trackbacks/828.html   初学T-SQLW记之ON[PRIMARY]

 

  q些天什么都没做。年前似乎有忙不完的事,q后了却又有了好逸的毛病。。。?/P>

  今天才开始看学校实验指导的数据库开发实例。以前一直没有时间来看。。?/P>

  创徏表的语句中,最后L一句on[primary]Q这是什么意思?

  ȝ联机丛书。在CREATE TABLE的语法下g没有扑ֈ。硬着头皮看下去,l于明白了一些?/P>

  写出来吧。侯捯师_发表是最好的记忆。:Q?/P>

  在CREATE TABLE的语法中有这样一句可选语法项目:

  [ ON { filegroup | DEFAULT } ]

  用来指定存储表的文gl?/P>

  如果指定 filegroupQ则表将存储在指定的文gl中。数据库中必d在该文gl。如果指?DEFAULTQ或者根本未指定 ON 参数Q则表存储在默认文gl中?/P>

  QDEFAULT q不是关键字。DEFAULT 是默认文件组的标识符q对其q行定界Q如 ON "DEFAULT"、ON [DEFAULT]。)

  ON [PRIMARY]是表C是徏立在L件组上。PRIMARY表示L件组。如果没有指定默认文件组Q则L件组是默认文件组QON [PRIMARY]也可以省略掉了?/P>

  由数据库说开来。Microsoft] SQL Server?2000 使用一l操作系l文件映数据库Q也可以说将数据库映到一l操作系l文件上Q看你怎么理解了)。数据库中的所有数据和对象Q如表、存储过E、触发器和视图)都存储在操作pȝ文gQ数据库文gQ:主要数据文g 、次要数据文?和事务日?文g中?/P>

  1.主要数据文g

  该文件包含数据库的启动信息,q用于存储数据。是数据库的LQ指向数据库中文件的其它部分。每个数据库都有一个主要数据文件。主要数据文件的推荐文g扩展名是 .mdf?/P>

  2.ơ要数据文g

  q些文g含有不能|于主要数据文g中的所有数据即包含除主要数据文件外的所有数据文件。有些数据库可能没有ơ要数据文gQ而有些数据库则有多个ơ要数据文g。(如果L件可以包含数据库中的所有数据,那么数据库就不需要次要数据文件。有些数据库可能_大故需要多个次要数据文Ӟ或用位于不同磁盘驱动器上的辅助文g数据扩展到多个盘。)ơ要数据文g的推荐文件扩展名?.ndf?/P>

  3.事务日志文g

  该数据库的日志信息。每个数据库都必至有一个日志文件。日志文件的推荐文g扩展名是 .ldf?/P>

  文gl?/P>

  Z分配和管理目的,可以数据库文g分成不同的文件组。文件组是SQL Server 2000数据文g的一U逻辑理单位。SQL Server中一个或多个文g的命名集合,它构成分配或用于数据库管理的单个单元。在首次建数据库Q或者以后将更多文gd到数据库Ӟ可以创徏文gl。文件组不能独立于数据库文g创徏。文件组是在数据库中Ҏ件进行分l的一U管理机制?/P>

  有两U类型的文gl:主要文gl和用户定义文gl。(可以_数据库由一个主文gl和L用户定义的文件组l成。)

  1.L件组 QPRIMARYQ?/P>

  用户定义文gl?默认文gl?同ؓ文gl的一U类型?/P>

  其包含主要数据文件和M没有明确指派l其它文件组的其它文件。系l表的所有页均分配在L件组.

  2.用户定义文gl?/P>

  用户定义文gl是?CREATE DATABASE ?ALTER DATABASE 语句中,使用 FILEGROUP 关键字或?SQL Server 企业理器内?属?对话框指定的文gl?/P>

  另:默认文gl?QDEFAULT 文gl)

  文gl的一U类型,其包含在创徏时没有指定文件组的所有表和烦引的c在每个数据库中Q每ơ只能有一个文件组是默认文件组。如果没有指定默认文件组Q则默认文gl是L件组?可用 ALTER DATABASE 语句更改默认文gl。通过更改默认文gl,创徏时没有指定文件组的Q何对象都被分配到新默认文件组中的数据文g。然而,pȝ对象和表仍然保留?PRIMARY 文gl内Q而不是新默认文gl。(每个数据库中都有一个文件组作ؓ默认文gl运行。当 SQL Server l创建时没有为其指定文gl的表或索引分配|Q将从默认文件组中进行分配。一ơ只能有一个文件组作ؓ默认文gl。db_owner 固定数据库角色成员可以将默认文gl从一个文件组切换到另一个。如果没有指定默认文件组Q则L件组是默认文件组。)

  ?SQL Server 2000 在没有文件组时也能有效地工作Q因此许多系l不需要指定用户定义文件组。在q种情况下,所有文仉包含在主文gl中Q而且 SQL Server 2000 可以在数据库内的M位置分配数据。文件组不是在多个驱动器之间分配 I/O 的唯一Ҏ?/P>

  附:

  . Z么要建立文gl?/P>

  建立文gl有两个目的?/P>

  q 一是可以更好地分配和管理存储空_通过控制在特定磁盘驱动器上放|数据和索引来提高数据库的性能?/P>

  q 二是׃操作pȝ对物理文件的大小q行了限Ӟ所以当某个盘上的数据文g过单个文g允许的最大值时Q可以用文件组中存

  贮在其他驱动器上的数据文件l扩充存储空间?/P>

  . 数据文g和文件组的用规?/P>

  SQL Server 2000中的数据文g和文件组的用规则包括:

  q 数据文g或文件组不能׃个以上的数据库用?/P>

  q 数据文g只能是一个文件组的成员?/P>

  q 数据文g和日志文件不能属于同一文g或文件组?/P>

  q 日志文g不能属于M文gl?/P>

  q 只有文gl中的所有数据文仉没有I间了,文gl的文g才会自动增长?/P>

  . 文gl的工作原理

  文gl对l内的所有文仉使用按比例填充策略。当数据写入文件组ӞSQL Server 2000Ҏ文g中的可用I间量将一定比例的数据写入?/P>

  件组的每个文Ӟ而不是将所有的数据先写满第一个文Ӟ接着再写入下一个文件。例如,如果文g1?00MB的可用空_文g2?00MB的可

  用空_则从文g1中分配一个盘区,从文?中分配两个盘区,依此cL。这P两个文g几乎同时填满?/P>

  一旦文件组内的所有文件已满,SQL Server 2000p动地采用循环方式一ơ扩展一个文Ӟ以容Ux多的数据Q假定数据库讄动增长)

  。例如,某个文gl由3个文件组成,它们都设|ؓ自动增长。当文gl中的所有文件的I间用完Ӟ只扩展第一个文件。当W一个文件已满,

  不能更多的数据写入该文件组Ӟ扩展W二个文件。当W二个文件已满,不能更多的数据写入该文件组Ӟ扩展W?个文件。如果第3个文

  件已满,不能更多的数据写入该文件组Q那么再ơ扩展第一个文Ӟ以此cL?/P>

  正时׃文gl的q种Ҏ,允许跨多个磁盘、多个磁盘控制器?RAIDQ廉L盘冗余阵列)pȝ创徏数据库,可提高数据库性能。例如,?/P>

  果计机中有4个磁盘,那么可以创徏一个由3个数据文件和一个日志文件组成的数据库,每个盘上放|一个文件。在Ҏ据进行访问时Q四

  个读/写磁头可以同时ƈ行地讉K数据Q从而加速数据库操作?/P>

  另外Q文件和文gl允许数据布局Q可以在特定的文件组中创。因为特定表的所有输?输出都可以定向到特定的磁盘,所以性能得以改善

  。例如,可以最常用的表攑֜一个文件组中的一个文件中Q该文gl位于一个磁盘上Q而将数据库中其它的不常访问的表放在另一个文件组

  中的其它文g中,该文件组位于W二个磁盘上?/P>

  . 如何使用文gl的

  q 大多数数据库在只有单个数据文件和单个事务日志文g的情况下可以很好地运行?/P>

  q 如果使用多个文gQ请为附加文件创建第二个文gl,q将其设|ؓ默认文gl。这PL件将仅包含系l表和对象?/P>

  q 若要获得最x能Q请在尽可能多的可用本地物理盘上创建文件或文gl,q将争夺I间最Ȁ烈的对象|于不同的文件组中?/P>

  q 使用文gl以允许对象放|在特定的物理磁盘上?/P>

  q 在同一联接查询中用的不同表置于不同的文gl中。由于采用ƈ行磁盘输?输出对联接数据进行搜索,所以性能得以改善?/P>

  q 最常访问的表和属于q些表的非聚集烦引置于不同的文gl上。如果文件位于不同的物理盘上,׃采用q行输入/输出Q所?/P>

  性能得以提高?/P>

  q 不要日志文件与其它文g和文件组|于同一物理盘上?/P>



]]>
˾Ʒþ޸岻 | պƷھþ | þþƷަvDz| þ99Ʒþ| Ĺ˾Ʒþò| þþþƷþþþӰԺ| þþþ޾Ʒַ| þҹ³˿ƬҹƷ| þþþþݴۺϾƷ | ˾Ʒþ޸岻 | Ʒþþþá| þù޾Ʒ鶹| ˾ھƷþþþ| 69Ʒþþþ9999| þþþƷƵѹۿ| þþɫۺϾɫ99| Ĺ˾Ʒþ޾ƷA뾫Ʒ| 97Ʒ˾þþô߽ | 9999Ʒŷþþþþ | 99ȳ˾ƷȾþ669| ˾ƷþѶ | 69Ʒþþþ99| Ʒþþþþ| ŷþþþƷӰԺ| þþþþҹӰԺ| ɫۺϾþĻ| ˳þõӰվ| AVþþƷ| 91鶹Ʒ91þþþþ| Ʒ99þþþƷ| þþƷþ˼˼| þ޾Ʒۿ| ŷۺϾþþ| һaƬþëƬ16| ޹Ʒ˾þ| þþƷ}Ů| þ99Ʒþþþþ벥| ˳ŷþ | Ʒþùһ㽶 | þþþƷһ| 18ƾþþAAAƬ|