随笔分类 -  SQL SERVER

微软数据库
摘要:为了保证原创权益,首先声明,此文章是转自博客园宋沄剑园友的文章,纯属个人学习之用,原文章地址为:http://www.cnblogs.com/CareySon/archive/2011/12/26/2301597.html简介 在SQL Server中,数据库在硬盘上的存储方式和普通文件在windows中的存储方式没有什么不同,仅仅是几个文件而已,SQL Server通过管理逻辑上的文件组的方式管理文件,理解文件和文件组的概念对更好的配置数据库来说是基本的知识理解文件和文件组 在SQL Server中,通过文件组这个逻辑对象对存放数据的文件进行管理。 先看一张图:我们看到的逻辑数据库由一个或者 阅读全文
posted @ 2012-02-28 22:58 指尖流淌 阅读(968) 评论(0) 推荐(0) 编辑
摘要:ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性,原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。 原子性(atomicity) 原子性意味着数据库中的事务执行是作为原子,及不可再分,简单一句话:要么执行,要么不执行。 在SQL Server中,每一个单独的语句都可以看做是默认包含的一个事务之中:所以,每一个语句本身具有原子性,要么全部执行,要么全部不执行,不会有中间状态: 上面说了,每一条T-SQL语句都可以看做是默认包裹在一个事务之中的,SQL Server对. 阅读全文
posted @ 2012-02-15 14:26 指尖流淌 阅读(1326) 评论(0) 推荐(0) 编辑
摘要:在SQL Server中,非聚集索引其实可以看做是一个含有聚集索引的表,但相比实际的表而言,非聚集索引中所存储的表的列数窄很多,因为非聚集索引仅仅包含原表中非聚集索引的列和指向实际物理表的指针。 并且,对于非聚集索引表来说,其中所存放的的列是按照聚集索引来存放的,所以查找速度要快了很多。但是对于性能的榨取来说,SQL Server总是竭尽所能,假如仅仅是通过索引就可以在B树的叶子节点上获取所需数据,而不再通过叶子节点上的指针去查找实际的物理表,那性能的提升将会更胜一筹。非聚集索引的覆盖 正如前面简洁所说。非聚集索引其实可以看作一个聚集索引表,当这个非聚集索引中包含了查询所需要的所有信息时,则. 阅读全文
posted @ 2012-02-05 20:59 指尖流淌 阅读(739) 评论(0) 推荐(0) 编辑
摘要:在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能。但索引可以在大多数情况下大大提升查询性能高。在OLAP中尤其明显,要完全理解索引的概念,需要了解大量原理性的知识,包括B树,堆,数据库页,区,填充因子,碎片,文件组等等一系列相关知识。 索引时对数据库中表中一列和多列的值进行排序的一种结构,使用索引可以快速访问数据表中特定的信息。 精简来说,索引时一种结构,在SQL Server中,索引和表(这里值得是加了聚集索引的表)的存储结构是一样的,都是B树,B树是一种用于查找平衡多叉树,理解B树的概念如下图: 理解为什么使用B树作为索. 阅读全文
posted @ 2012-02-03 17:03 指尖流淌 阅读(8384) 评论(6) 推荐(1) 编辑
摘要:最近遇到一个情况,需要在内网系统中出一个统计报表。需要根据不同条件使用多个group by语句,需要将所有聚合的数据进行union操作来完成不同维度的统计查看。 知道发现了在SQL Server 2008之后引入了grouping sets这个对于group by的增强后,上面的需求实现起来就简单的多,下面我们用AdventureWork中的表作为demo来解释一下grouping sets. 假设我现在需要两个维度查询我的销售额度,查询T-SQL如下:而使用SQL Server 2008之后新增的grouping sets语句,仅仅需要这样写:值得注意的是,虽然上面使用grouping s. 阅读全文
posted @ 2012-02-02 13:54 指尖流淌 阅读(969) 评论(0) 推荐(0) 编辑
摘要:对于Select查询语句来说,通常情况下,为了是T-SQL代码更加简洁和刻度,在一个查询中应用另外的结果集都是通过视图而不是查询进行分解的,但是,视图作为系统对象存储在数据库中,那对于结果集仅仅需要在存储过程或是用户自定义函数中使用一次的时候,使用视图就显得有限奢侈了。 公用表达式(Common Table Expression)是SQL Server2005版本之后引入的一个特性,.CTE可以看做是一个临时的结果集,可以再接下来的select,insert,update,delete,merge语句中被多次使用,使用公用表达式可以让语句更加清晰简练。 初次之外,根据微软对CTE好处的描述,. 阅读全文
posted @ 2012-02-02 13:31 指尖流淌 阅读(742) 评论(0) 推荐(0) 编辑
摘要:视图可以看做定义在SQL Server上的虚拟表,视图正如其名字的含义一样,是另一种查看数据的入口,常规视图本身并不存储实际的数据,而仅仅存储一个select语句和所涉及的表的关系。 通过视图,客户端不再需要知道底层table的表结构及其之间的关系,视图提供了一个统一访问的数据的接口。视图的优点 1、视图隐藏了底层的表的结构,简化了数据访问的操作 2、因为隐藏了底层的表结构,所以大大加强了安全性,用户只能看到视图提供的数据 3、使用了视图,方便了权限管理,让用户对视图的权限而不是度底层表的权限进一步加强了安全性4、提供了一个用户访问的接口,当底层表改变后,改变视图语句来进行适应,使已经建立在. 阅读全文
posted @ 2012-02-01 18:26 指尖流淌 阅读(2134) 评论(0) 推荐(1) 编辑
摘要:在关系数据库中,我们对于查询的思考是面向集合的,而游标打破了这一规则,游标使得我们思考方式变为逐行进行。 正常面向集合的思维方式是:而对于游标来说:这也是为什么游标是邪恶的,它会使开发人员变懒,懒得去想面向集合的查询方式实现某些功能。同样的,在性能上,游标会吃更多的内存,减少可用的并发,占用宽带,锁定资源,当然还有更多的代码量....从游标对数据库的读取方式来说,不难看出游标为什么占有更多资源了,打个比方:当你从ATM取钱的时候,是一次去1000效率更高呢,还是取10次100?游标的好处:1、现存系统有一些游标,我们查询必须通过游标来实现2、作为一个备用方式,当我们穷尽了while循环,子查. 阅读全文
posted @ 2012-02-01 15:19 指尖流淌 阅读(1338) 评论(0) 推荐(0) 编辑
摘要:关系数据库的起源起源于数学中的集合概念,所以集合和集合之间,也同样继承了数学集合之间的运算,而对于在关系数据库中,常常用于两个数据库中并没有直接的关系数据库的”关系“,比如外键,但两个数据集会有间接的关系,比如两届比赛,参加比赛人员集合之间会有间接的关系。 在T-SQL中,关系运算实际上可以分为四类,首先看我们举例子用的表:这里的例子表分别为两个不同会以参加的人员记录,分别为Meeting1和Meeting2如下:关系运算的具体可以分为以下四类:1.A∩B,既是所求数据集既在A中,又在B中 在实例表中,实际的例子为即参加第一个会以,有参加第二个会以人的集合,如下图:2.A∪B,既所求数据在数. 阅读全文
posted @ 2012-01-31 17:47 指尖流淌 阅读(776) 评论(0) 推荐(1) 编辑
摘要:变量对于某一种语言是必不可少的一部分,当然对于T-SQL来讲也是一样,在简单查询中,但是对于复杂的查询或存储过程中,变量都是必不可少的一部分。和高级语言一样,在T-SQL中,变量按生存范围可以分为全局变量(Global Variable)和局部变量(Local Variable)1、全局变量时有系统定义的,在整个SQL Server实例内都能访问到的变量,全部变量以@@作为第一个字符,用户只能访问,不能赋值。2、局部变量由用户定义,生命周期只在一个批处理内有效。局部变量以@作为第一个字符,由用户自己定义和赋值。一个简单的例子如下: 因为全局变量仅仅是用于读取系统的一些参数,具体每个全局变量所. 阅读全文
posted @ 2012-01-31 16:34 指尖流淌 阅读(1163) 评论(0) 推荐(0) 编辑
摘要:和其他高级语言一样,T-SQL中也有用于控制流程的语句。T-SQL中的流程控制语句进一步扩展了T-SQL的力量....使得大部分业务逻辑都可以用在数据库层里面进行。但很多对于T-SQL中的流程控制语句并没有系统的了解 在没有流程控制语句的情况下,T-SQL语句是按照从上到下的顺序逐个执行;使用流程控制语句可以让开发人员可以基于某些逻辑进行选择性的跳转,实现了类似高级语言的跳转结构流程控制语句的使用范围和Go关键字 流程控制语句只能在单个批处理段(Batch),用户自定义函数和存储过程中使用。不能跨多个批处理段或者用户自定义函数和存储过程。 一个批处理段是有一个或者多个语句组成的一个批处理,之. 阅读全文
posted @ 2012-01-31 15:28 指尖流淌 阅读(1109) 评论(0) 推荐(0) 编辑
摘要:T-SQL不仅仅是一个用于查询数据库的语言,还是一个可以对数据进行操作的语言。基于列的case表达式就是其中一种,不像其他查询语言可以互相替代(比如用子查询实现的查询也可以使用join来实现),case表达式在控制基于列的逻辑表达式大部分是无法替代的。 基于列的逻辑表达式,其实就是case表达式,可以用在select,update,delete,set以及in,where,order by和having子句之后。由于这里讲的是T-SQL查询,所以只说到case表达式在select子句和order by子句中的使用。 case表达式实现的功能类似编程语言中的if....then....else. 阅读全文
posted @ 2012-01-31 12:29 指尖流淌 阅读(617) 评论(0) 推荐(0) 编辑
摘要:SQL有着非常强大且灵活的查询方式,而多表连接操作往往也可以用子查询进行替代,子查询本质上是嵌套进其他select,update,insert,delete语句的一个被限制的select语句,在子查询中,只有下面几个子句可以使用1、select子句(必须)2、from子句(必须)3、where子句(可选)4、group by(可选)5、having(可选)6、order by(只有在top关键字被使用时才可用)子查询可以嵌套在其他子查询中,这个嵌套最多可以达到32层。子查询也叫内部查询(inner query)或者内部选择(innder select),而包含子查询的查询语句也叫外部查询(o. 阅读全文
posted @ 2012-01-29 22:41 指尖流淌 阅读(12710) 评论(0) 推荐(1) 编辑
摘要:sql server 2008提供了一个增强的Sql命令Merge,用法参看MSDN。能根据两张表数据的不同,对两张表进行数据执行插入,更新或删除等操作,一般用在数据的抽取,例如,根据在另一个表中找到的差异在一个表中插入、更新或删除行,可以对两张表数据进行同步。看例子,假如,有一总产品列表,一个分店产品列表,需要从分店添加产品时更新产品列表。总产品表,分店产品表结构完全一致:if OBJECT_ID('Demo_AllProducts')is not null drop table Demo_AllProductsgoCreate table Demo_AllProducts( 阅读全文
posted @ 2012-01-29 18:35 指尖流淌 阅读(442) 评论(0) 推荐(0) 编辑
摘要:在SQL Server 2008中新增功能,可以使用单个insert命令插入多行举例:CREATE TABLE [dbo].[test2]( [编号] [int] NULL, [姓名] [varchar](20) NULL, [一季度] [int] NULL, [二季度] [int] NULL, [三季度] [int] NULL, [四季度] [int] NULL) insert into test2(编号,姓名,一季度,二季度,三季度,四季度)values(1,'a1',1,1,1,1),(2,'a2',2,2,2,2),(2,'a3',3,3 阅读全文
posted @ 2012-01-29 17:33 指尖流淌 阅读(369) 评论(0) 推荐(0) 编辑
摘要:SQL Server查询1、查询的时候应该尽量按照复合索引中的顺序来做条件查询;2、如果在程序中有for或者是freach,在存储过程中又有if exist,那就要看是否可以再表中加入复合索引了,if not exists可以转换为if exists来使用索引;3、在查询尽量少使用*或者全表字段来查询。第一,返回的数据集比较大;第二,产生更多的IO操作;第三,会使用到Bookmarklookup的查询计划,性能有所下降;如果能使用覆盖索引来查询是最理想的。4、下面关于查询的性能比较1、返回行数较多:索引覆盖>聚集索引>表扫描>堆积的非聚集索引>聚集的非聚集索引2、返回行 阅读全文
posted @ 2012-01-29 17:02 指尖流淌 阅读(377) 评论(0) 推荐(0) 编辑
摘要:游标1、尽量少用游标,如果不得不用,那就要看是否可以对逻辑进行整合,分出不同的情况,让在一部分情况是使用Insert select的方式来一次性插入(注意下例中的业务分析,这个是关键)2、如果存储过程花费的时间比较长,而且无法避免使用游标,那我们就要分析系统的业务,看大部分的情况是走哪条路的,那我们对大部分会发生的事做优化,也是可以达到我们优化的目的的;(比如IXC发起的时候在insert到tb Todo表中都要先判断tbTodo是否存在数据的,那把部分情况是不存在的,那我们就一次性判断count,如果没有就使用Insert select一次性插入到tb Todo)转自http://gaiza 阅读全文
posted @ 2012-01-20 21:09 指尖流淌 阅读(325) 评论(0) 推荐(0) 编辑
摘要:1、查询的时候尽量按照复合索引的顺序来做条件查询,(比如IXC中spInterActiveInstance_GetByIDToStat条件and ProcessState<>99的位置)2、如果在程序中有For或者Foreach,在存储过程中又有If Exists,那么就要看是否可以再表中加入复合索引了,If Not Exists可以转换为If Exists来使用索引;3、在查询中尽量少使用*或者全表字段来查询数据。第一、返回的数据集比较大;第二,产生更多的IO操作,第三,会使得Bookmarklookup的查询计划,性能有所下降;如果能使用到覆盖索引来查询是最理想的。4、下面关于 阅读全文
posted @ 2012-01-20 21:00 指尖流淌 阅读(307) 评论(0) 推荐(0) 编辑
摘要:索引1、复合索引(where a and b)如果没有对a和a做单一索引,查询的时间为a;如果对a做单一索引,查询时间为b;如果对b做单一索引,查询时间为c;如果对a,b做复合索引,查询时间为d,那么时间的比较就应该是a>b=c>d;(比如spMsgreader_Distribute中使用where inforID=@infoID and UserID=@userID,插入7000次的时候就明显的看到性能了;(8秒:1:50秒)注意升序和降序的区别?)2、当高选择性的非聚集索引达到5%的选择性时,该索引时非常有用的3、关于复合索引属性列位置问题,应该把高选择性的列放在坐左边(以前就 阅读全文
posted @ 2012-01-20 20:45 指尖流淌 阅读(386) 评论(2) 推荐(0) 编辑
摘要:create table site_user ( id int IDENTITY(1,1) PRIMARY KEY, [name] varchar(20), code varchar(20), date datetime )用索引实现数据优化,一个基本的了解,参照http://www.cnblogs.com/gaobanana/archive/2012/01/16/2323967.html1、建表create table site_user ( id int IDENTITY(1,1) PRIMARY KEY, [name] varchar(20), c... 阅读全文
posted @ 2012-01-18 22:46 指尖流淌 阅读(490) 评论(0) 推荐(0) 编辑