仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 715|回复: 8
打印 上一主题 下一主题

[学习教程] 往SQL SERVER的表中拔出列与在表尾追加列的区分详解

[复制链接]
愤怒的大鸟 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:09:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。索引不是万能的,索引可以加快数据检索操作,但会使数据修改操作变慢。每修改数据记录,索引就必须刷新一次。之前一向觉得在SQLSERVER中,在表的列两头拔出新列与在表的最初面增加一列,这二者应当是一样的。明天特地为这二者做了对照,剖析以下:

我们先创立一个复杂的表,用来做剖析:
CREATETABLE[dbo].[Table_1](
        [ID][int]IDENTITY(1,1)NOTNULL,
        [Name][varchar](50)COLLATEChinese_PRC_CI_ASNULL
)ON[PRIMARY]


然后在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[PRIMARY]
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。仅凭这句话,无法还原表的数据。
不帅 该用户已被删除
沙发
发表于 2015-1-18 12:13:42 | 只看该作者
不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关
莫相离 该用户已被删除
板凳
发表于 2015-1-24 16:30:24 | 只看该作者
索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。
admin 该用户已被删除
地板
发表于 2015-2-2 11:10:07 | 只看该作者
groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby子句中指定的表达式的值分组查询结果。
老尸 该用户已被删除
5#
发表于 2015-2-7 18:45:28 | 只看该作者
我个人认为就是孜孜不懈的学习
海妖 该用户已被删除
6#
发表于 2015-2-23 01:44:34 | 只看该作者
理解了存储结构,再阅读下性能优化的章节基本上会对sqlserver有个清晰地认识
再现理想 该用户已被删除
7#
发表于 2015-3-7 06:24:18 | 只看该作者
其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!
兰色精灵 该用户已被删除
8#
发表于 2015-3-14 15:21:41 | 只看该作者
原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜!
简单生活 该用户已被删除
9#
发表于 2015-3-21 12:14:02 | 只看该作者
我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2025-1-10 06:17

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表