摘要:
分类: Sql Server 2008 2009-08-10 09:28 206人阅读 评论(0) 收藏 举报在SQL Server中使用rollback会回滚所有的未提交事务状态,但是有些时候我们只需要回滚部分语句,把不需要回滚的语句提到事务外面来,虽然是个方法,但是却破坏了事务的ACID。其实我们可以使用SQL Server中的Savepoints来解决上述问题。示例如下:1.先建立测试表: CREATE TABLE [dbo].[ttt]( [Id] [int] NULL, [mark] [int] NULL ) 2.SQL 语句 begin tran insert into tt... 阅读全文
摘要:
SQL Server的性能主要取决于磁盘I/O效率,提高I/O效率某种程序上就意味着提高性能。SQL Server 2008提供了数据压缩功能来提高磁盘I/O。数据压缩意味着减小数据的有磁盘占用量,所以数据压缩可以用在表,聚集索引,非聚集索引,视图索引或是分区表,分区索引上。数据压缩可以在两个级别上实现:行级别和页级别。页级别压缩包括行级别压缩。表和索引在创建的同时就可以压缩,也可以使用Alter Table Rebuild With 或是 Alter Index Rebuild With语法压缩已存在表或是索引。当堆(Heap)上的压缩状态改变时,所有的非聚集索引也会重建。下面让我们看看压缩 阅读全文
摘要:
分类: Sql Server 2008 2010-03-04 11:42 1264人阅读 评论(4) 收藏 举报优化存储过程有很多种方法,下面介绍最常用的7种。1.使用SET NOCOUNT ON选项我们使用SELECT语句时,除了返回对应的结果集外,还会返回相应的影响行数。使用SET NOCOUNT ON后,除了数据集就不会返回额外的信息了,减小网络流量。2.使用确定的Schema在使用表,存储过程,函数等等时,最好加上确定的Schema。这样可以使SQL Server直接找到对应目标,避免去计划缓存中搜索。而且搜索会导致编译锁定,最终影响性能。比如select * from dbo.Tes 阅读全文
摘要:
问题重现:--建表语句,测试数据 create table TestTable(Id int, Name nvarchar(20),CreateTime datetime) go declare @Count int = 1 while(@Count<1000) begin insert into TestTable select @Count,'Name '+CAST(@Count as nvarchar(10)),DATEADD(day,@Count,GETDATE()) set @Count = @Count+1; end go --建索引 create clust 阅读全文
摘要:
今天使用Merge语句时遇到了一个问题,当源表数据集为空时,merge就不工作了。下面举一个例子来具体说明一下:有两个表SourceTable为登陆表,TargetTable为授权表,如果访问用户在登陆表中,更新授权表的授权级别,否则授权0表示游客。sql语句如下:--SourceTable为登陆表,TargetTable为授权表--如果访问用户在登陆表中,更新授权表的授权级别,否则授权0表示游客。create table SourceTable(UserName nvarchar(10),Pwd int,[Level] int)create table TargetTable(UserNam 阅读全文
摘要:
在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题。下面介绍SQL Server支持的两种批量数据插入方法:Bulk和表值参数(Table-Valued Parameters)。运行下面的脚本,建立测试数据库和表值参数。[c-sharp] view plaincopyprint?--CreateDataBasecreatedatabaseBulkTestDB;gouseBulkTestDB;go--CreateTableCreatetableBulkTestTable(Idintprim. 阅读全文
摘要:
熟练使用SQL Server中的各种用法会给查询带来很多方便。今天就介绍一下EXCEPT和INTERSECT。注意此语法仅在SQL Server 2005及以上版本支持。EXCEPT是指在第一个集合中存在,但是不存在于第二个集合中的数据。INTERSECT是指在两个集合中都存在的数据。测试如下:[c-sharp] view plaincopyprint?createtablet1(idint,markchar(2))gocreatetablet2(idint,markchar(2))goinsertintot1select1,'t1'unionallselect2,'t 阅读全文