往SQL SERVER的表中拔出列与在表尾追加列的区分详解
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。索引不是万能的,索引可以加快数据检索操作,但会使数据修改操作变慢。每修改数据记录,索引就必须刷新一次。之前一向觉得在SQLSERVER中,在表的列两头拔出新列与在表的最初面增加一列,这二者应当是一样的。明天特地为这二者做了对照,剖析以下:我们先创立一个复杂的表,用来做剖析:
CREATETABLE.(
IDENTITY(1,1)NOTNULL,
(50)COLLATEChinese_PRC_CI_ASNULL
)ON
然后在MicrosoftSQLServerManagementStudio中在该表的ID列与Name列中拔出varchar(50)列UserID,然后点击天生变动剧本,天生的剧本以下:
/*为了避免任何大概呈现的数据丧失成绩,您应当先细心反省此剧本,然后再在数据库计划器的高低文以外运转此剧本。*/
BEGINTRANSACTION
SETQUOTED_IDENTIFIERON
SETARITHABORTON
SETNUMERIC_ROUNDABORTOFF
SETCONCAT_NULL_YIELDS_NULLON
SETANSI_NULLSON
SETANSI_PADDINGON
SETANSI_WARNINGSON
COMMIT
BEGINTRANSACTION
GO
CREATETABLEdbo.Tmp_Table_1
(
IDintNOTNULLIDENTITY(1,1),
UserIDvarchar(50)NULL,
Namevarchar(50)NULL
)ON
GO
SETIDENTITY_INSERTdbo.Tmp_Table_1ON
GO
IFEXISTS(SELECT*FROMdbo.Table_1)
EXEC(INSERTINTOdbo.Tmp_Table_1(ID,Name)
SELECTID,NameFROMdbo.Table_1WITH(HOLDLOCKTABLOCKX))
GO
SETIDENTITY_INSERTdbo.Tmp_Table_1OFF
GO
DROPTABLEdbo.Table_1
GO
EXECUTEsp_renameNdbo.Tmp_Table_1,NTable_1,OBJECT
GO
COMMIT
能够看出来,SQLSERVER是先将拔出后的列和原本的列一同创立了一个新的表Tmp_Table_1,然后设置IDENTITY_INSERT为on,即开启自增量显式拔出,再将Table_1的数据复制到Tmp_Table_1中,然后封闭自增量显式拔出,再然后删除dbo.Table_1,最初修正dbo.Tmp_Table_1表名为dbo._Table_1。
关于IDENTITY_INSERT的详细用法,请拜见本站:
往自增列拔出显式值-SETIDENTITY_INSERT详解
这个中触及的步骤良多,假如为该表创立了触发器,束缚等,情形就加倍庞大了,并且在数据转移的过程当中,简单形成数据毛病。
我们再测试间接在表的最初一列Name后追加varchar(50)列UserID,然后点击天生变动剧本,天生的剧本以下:
/*为了避免任何大概呈现的数据丧失成绩,您应当先细心反省此剧本,然后再在数据库计划器的高低文以外运转此剧本。*/
BEGINTRANSACTION
SETQUOTED_IDENTIFIERON
SETARITHABORTON
SETNUMERIC_ROUNDABORTOFF
SETCONCAT_NULL_YIELDS_NULLON
SETANSI_NULLSON
SETANSI_PADDINGON
SETANSI_WARNINGSON
COMMIT
BEGINTRANSACTION
GO
ALTERTABLEdbo.Table_1ADD
UserIDvarchar(50)NULL
GO
COMMIT
能够看出来,如许SQLSERVER实行的SQL十分复杂,间接就Alter表了,不会产生数据转移与创立一时表等情形,固然也不会形成数据转移毛病了。
以是,假如不是有出格的请求,在表中增加新列时,我们激烈保举间接在表尾增加,而不是在表两头拔出新的列。上面我们说了DML的闪回方案。但对于DDL却无能为力,对于大多数的DDL,即使是rowbase格式,二进制日志binlog中仍只记录语句本身。对于删表操作,只记录一个语句droptablet。仅凭这句话,无法还原表的数据。 不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关 索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。 groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby子句中指定的表达式的值分组查询结果。 我个人认为就是孜孜不懈的学习 理解了存储结构,再阅读下性能优化的章节基本上会对sqlserver有个清晰地认识 其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?! 原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜! 我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力
页:
[1]