文章分类 -  SqlServer

摘要:1.1.1 摘要 相信大家对于SQL Transcation再熟悉不过,它确保了数据库的数据一致性和安全性,尤其在对数据执行增删时,如果发生异常和错误它就会触发事务回滚,从而确保了我们数据的一致性和安全性,下面我们将通过分四部分介绍事件(Transcation)。1.1.2 正文 首先让我们通过一个具体的例子介绍Transcation的使用,假如我们的数据库中有一个表UserInfo,它包含三个字段分别为:UserID(自增)、UserName (nvarchar)和LuckyNumber (tinyint),如下图所示:图1 UserInfo表 UserInfo表的sql代码如下:-- Th 阅读全文
posted @ 2012-07-13 22:08 超级塞亚人 阅读(131) 评论(0) 推荐(0)
摘要:据了解绝大多数开发人员对于索引的理解都是一知半解,局限于大多数日常工作没有机会、也什么没有必要去关心、了解索引,实在哪天某个查询太慢了找到查询条件建个索引就ok,哪天又有个查询慢了,再建立个索引就是,或者干脆把整个查询SQL直接发给DBA,让DBA直接帮忙优化了,所以造成的状况就是开发人员对于索引的理解、认识很局限,以下就把我个人对于索引的理解及浅薄认识和大家分享下,希望能解除一些大家的疑惑,一起走出索引的误区误区1.在表上建立了索引,在查询时用到了索引的列,索引就一定会生效 首先明确下这样的观点是错误的,SQL Server查询优化器是基于开销进行选择的优化器,通过一系列复杂判断来决定是否. 阅读全文
posted @ 2012-07-13 22:06 超级塞亚人 阅读(147) 评论(0) 推荐(0)
摘要:今天再次改老系统,看着前边的师兄留下的SQL,就想起了MS SQL 7.5和SQL2000。可能很多人都还没有习惯新版本(05版之后)的SQL语法,还是用以前开发MS SQL2000的方式实现功能,但是多少人会明白,换一种写法后,性能却相差十倍百倍呢!我用来做例子的是我们MES系统用到的一段简单功能T-SQL,都是使用同一个库、相同的表、相同的逻辑:开始前先记录时间,计算完成后看用了多少时间。我先用推荐的语法来写的方式,代码1是好的写法,由于是在我们系统的情景下描述的,看管不可照抄,只说明性能的差别。代码1:用WITH,把各个逻辑分开处理,再终合出最后结果,推荐! 1: declare ... 阅读全文
posted @ 2012-07-13 22:05 超级塞亚人 阅读(197) 评论(0) 推荐(0)
摘要:WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到。 有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数据的部分。 特别对于UNION ALL比较有用。因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,所以可以使用WITH AS短语,则只要执行一遍即可。如果WITH AS短语所定义的表名被调用两次以上,则优化器会自动将WITH AS短语所获取的数据放入一个TEMP表里, 如果只是被调用一次,则不会。而提示m. 阅读全文
posted @ 2012-07-13 22:05 超级塞亚人 阅读(482) 评论(0) 推荐(0)
摘要:对于优化一个CPU占用很高的复杂SQL语句时,参数化查询的非常重要。相信有很多开发者和我一样对于参数化查询认识比较模糊,没有引起足够的重视错误认识1.不需要防止sql注入的地方无需参数化 参数化查询就是为了防止SQL注入用的,其它还有什么用途不知道、也不关心,原则上是能不用参数就不用参数,为啥?多麻烦,我只是做公司内部系统不用担心SQL注入风险,使用参数化查询不是给自己找麻烦,简简单单拼SQL,万事OK错误认识2.参数化查询时是否指定参数类型、参数长度没什么区别 以前也一直都觉的加与不加参数长度应该没有什么区别,仅是写法上的不同而已,而且觉得加参数类型和长度写法太麻烦,最近才明白其实两者不.. 阅读全文
posted @ 2012-07-13 22:05 超级塞亚人 阅读(202) 评论(0) 推荐(0)
摘要:1.使用SET NOCOUNT ON选项我们使用SELECT语句时,除了返回对应的结果集外,还会返回相应的影响行数。使用SET NOCOUNT ON后,除了数据集就不会返回额外的信息了,减小网络流量。2.使用确定的Schema在使用表,存储过程,函数等等时,最好加上确定的Schema。这样可以使SQL Server直接找到对应目标,避免去计划缓存中搜索。而且搜索会导致编译锁定,最终影响性能。比如select * from dbo.TestTable比select * from TestTable要好。from TestTable会在当前Schema下搜索,如果没有,再去dbo下面搜索,影响性能 阅读全文
posted @ 2012-07-13 22:04 超级塞亚人 阅读(327) 评论(0) 推荐(0)
摘要:虽然查询速度慢的原因很多,但是如果通过一定的优化,也可以使查询问题得到一定程度的解决。 查询速度慢的原因很多,常见如下几种:没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)I/O吞吐量小,形成了瓶颈效应。没有创建计算列导致查询不优化。内存不足网络速度慢查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)sp_lock, sp_who, 活动的用户查看,原因是读写竞争资源。返回了不必要的行和列查询语句不好,没有优化 可以通过如下方法来优化查询 :把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可... 阅读全文
posted @ 2012-07-13 22:04 超级塞亚人 阅读(102) 评论(0) 推荐(0)
摘要:建表知识对于建表大家都不陌生,这里主要说明一下几点注意实现:1、大数据字段最好剥离出单独的表,以便影响性能2、使用varchar,代替char,这是因为varchar会动态分配长度,char指定为20,即时你存储字符“1”,它依然是20的长度3、给表建立主键,看到好多表没主键,这在查询和索引定义上将有一定的影响4、避免表字段运行为null,如果不知道添加什么值,建议设置默认值,特别int类型,比如默认值为0,在索引查询上,效率立显。5、建立索引,聚集索引则意味着数据的物理存储顺序,最好在唯一的,非空的字段上建立,其它索引也不是越多越好,索引在查询上优势显著,在频繁更新数据的字段上建立聚集索引, 阅读全文
posted @ 2012-07-13 22:03 超级塞亚人 阅读(130) 评论(0) 推荐(0)
摘要:近期因工作需要,希望比较全面的总结下SQL SERVER数据库性能优化相关的注意事项,在网上搜索了一下,发现很多文章,有的都列出了上百条,但是仔细看发现,有很多似是而非或者过时(可能对SQL SERVER6.5以前的版本或者ORACLE是适用的)的信息,只好自己根据以前的经验和测试结果进行总结了。我始终认为,一个系统的性能的提高,不单单是试运行或者维护阶段的性能调优的任务,也不单单是开发阶段的事情,而是在整个软件生命周期都需要注意,进行有效工作才能达到的。所以我希望按照软件生命周期的不同阶段来总结数据库性能优化相关的注意事项。一、分析阶段一般来说,在系统分析阶段往往有太多需要关注的地方,系统各 阅读全文
posted @ 2012-07-13 22:03 超级塞亚人 阅读(113) 评论(0) 推荐(0)
摘要:No.1索引索引对于查询效率的作用众所周知,它分为聚集索引和非聚集索引,每个表只能有一个聚集索引,因为它对查询帮助最大,它的价值也就突显出来了,在以下情况下适合用聚集索引 1、含有大量非重复值的列。 2、使用BETWEEN,>,>=,<或<=返回一个范围值的列 3、被连续访问的列 4、返回大型结果集的查询 5、经常被使用连接或GROUP BY子句的查询访问的列No.2 存储过程介绍:在数据库的开发过程中,经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。如果项目的SP较多,书写又没有一定的规范,将会影响以后的系统维护困难和大SP逻辑的难以理解 阅读全文
posted @ 2012-07-13 22:03 超级塞亚人 阅读(136) 评论(0) 推荐(0)
摘要:考虑到处理数据一定要结合数据库自身实际,此篇就先从常用的辅助性能分析工具说起,SQL Server Profiler,性能计数器,执行计划,SQL Prompt等工具,也许平时都正在应用,下边结合自身使用进行介绍。SQL Server Profiler SQL Server提供的监控工具,在运行命令中输入“profiler”,也可以打开。此工具重点是监控在指定服务器上执行的SQL语句,存储过程等一切数据库的操作。对于分析数据库语句执行,死锁,性能瓶颈具有很好的作用。 打开SQL Server Profiler后,是一个空框架,我们需要添加对应的跟踪(Trace),打开文件中的新建跟踪,则弹出服 阅读全文
posted @ 2012-07-13 22:02 超级塞亚人 阅读(4162) 评论(0) 推荐(0)
摘要:逻辑查询处理的各个阶段一个普通格式的查询(5)SELECT DISTINCT TOPN <SELECTLIST>(1)FROM<LEFTTB>JOIN<RIGHTTB>ON<ONPRE>(2)WHERE<WHEREPRE>(3)GROUP BY<SPECIFICATION>(4)HAVING<HAVINGPRE>(6)ORDER BY<ORDERBYLIST>SQL与其他的编程语言不同,SQL第一个处理的子句是FROM子句,上面已标记出一个Select语句的执行顺序,ORDER BY是最后执行,SE 阅读全文
posted @ 2012-07-13 22:02 超级塞亚人 阅读(186) 评论(0) 推荐(0)
摘要:SQL脚本越写越多,总是觉得编写效率太过于低下,这和打字速度无关。在我个人编写SQL脚本时,至少会把SQL的格式排列成易于阅读的,因为其他人会阅读到你的SQL,无论是在程序中或是脚本文件中,良好的排版不仅让人看起来赏心悦目,在和他人之间做交流时也省时省力,不会因为揉成一团的sql去询问Team Member:您能帮我解释一下这么一大段sql是做什么的吗?虽然微软至SQL 2008以上的版本提供了SQL智能提示,但是它的反应实在是过于迟钝,等提示出来我们早就可以敲出一行语句了。而且它没有提供sql代码格式化的功能,咱们只能自己做手动格式化,手动格式化sql总是需要花费不少时间的。本文已经同步至我 阅读全文
posted @ 2012-07-13 22:01 超级塞亚人 阅读(5057) 评论(0) 推荐(0)
摘要:简介 SQL Server查询分析器是基于开销的。通常来讲,查询分析器会根据谓词来确定该如何选择高效的查询路线,比如该选择哪个索引。而每次查询分析器寻找路径时,并不会每一次都去统计索引中包含的行数,值的范围等,而是根据一定条件创建和更新这些信息后保存到数据库中,这也就是所谓的统计信息。如何查看统计信息 查看SQL Server的统计信息非常简单,使用如下指令: DBCC SHOW_STATISTICS('表名','索引名') 所得到的结果如图1所示。 图1.统计信息统计信息如何影响查询 下面我们通过一个简单的例子来看统计信息是如何影响查询分析器。我建立一个测试表 阅读全文
posted @ 2012-07-13 22:01 超级塞亚人 阅读(142) 评论(0) 推荐(0)
摘要:也许你看到这篇文章觉得很基础,别忙着吐糟,仔细想想,说不定你也会载在这个上面。关于left join 你到底了解多少?无论你是资深的老鸟还是刚入行的菜鸟,都会有所收获。也许某天你去面试的时候会突然碰到这样的一道题,心里会有所失望,竟然考这么简单的题!ON , 你错了,仔细想想会发现,结果会是这样的吗? 先来看看你对left join 了解多少把:这里定义了两张表,数据如下:declare @order table(ID int,Name varchar(20))declare @Detail table(ID int,Price float)insert into @order(ID,Na.. 阅读全文
posted @ 2012-07-13 22:00 超级塞亚人 阅读(269) 评论(0) 推荐(0)
摘要:文章导读拼SQL实现where in查询使用CHARINDEX或like实现where in 参数化使用exec动态执行SQl实现where in 参数化为每一个参数生成一个参数实现where in 参数化使用临时表实现where in 参数化like参数化查询xml和DataTable传参身为一名小小的程序猿,在日常开发中不可以避免的要和where in和like打交道,在大多数情况下我们传的参数不多简单做下单引号、敏感字符转义之后就直接拼进了SQL,执行查询,搞定。若有一天你不可避免的需要提高SQL的查询性能,需要一次性where in 几百、上千、甚至上万条数据时,参数化查询将是必然进行 阅读全文
posted @ 2012-07-13 22:00 超级塞亚人 阅读(115) 评论(0) 推荐(0)
摘要:这些天看了一篇微软官方发布的MS SQL Server2008性能问题处理及优化的英文文档,里面知识点介绍地很详细,在现实工作中也很实用,遂产生了想把它翻译一下的念头。翻译的过程,既可以帮助自己复习一下这些技术,也可以向其他还不熟悉这一块的朋友介绍一些新的知识,何乐而不为呢。只是这篇文章有点长,我会分成几篇随笔去介绍,所以,不光是对我耐性的考验,也是对你的考验哦!-------------------------------------------识别长的阻塞正如之前提到的,阻塞在SQL Server中是很正常的并且只是逻辑锁为了维护事务一致性的外在表现。然而,当等待超出了阈值,它就会影响相应 阅读全文
posted @ 2012-07-13 21:59 超级塞亚人 阅读(184) 评论(0) 推荐(0)
摘要:前些天我遇到一个问题,一个200Gb的库,其中一个表大约2000W行数据,我删除了其中约600W行数据。我想把删除后未使用的空间腾出来。按照以往的经验,重建这个表上的聚集索引就可以了。可是这次没有起效。原来这个表上只有一个非聚集主键索引。如何释放这个堆表未使用的空间首先来模拟出我遇到的情况:USE masterGOCREATE DATABASE TEST;GOUSE TEST GO --每一行占一个PAGE. CREATE TABLE tb_Test ( id INT NOT NULL , val CHAR(8000));ALTER TABLE dbo.tb_Test ADD CONSTRA. 阅读全文
posted @ 2012-07-13 21:59 超级塞亚人 阅读(1143) 评论(0) 推荐(0)
摘要:本文主要作为优化查询性能的一些知识储备,感觉知识点有些散,不知道起啥名字好,独立成文又没有达到把每个点都说透彻那样的高度,且就当做创建合理索引的一个楔子把。本文对实际应用没有太大的指导意义,但可以加深我们对SQL Server理解,夯实我们的基本功,就像小说里面的武功一样,没有足够的内功基础,给你再好的秘籍你也成不了武林高手。序言 写这篇文章时表示鸭梨很大,主要是对SQL Server的认识很有限,远远不足把这个话题说清楚,不过还是鼓起勇气写出来,也算作自己对索引认识的一个总结。索引这潭水太深了,应用场景不同,所建立的索引在有些情况下运行良好,有些情况下可能完全无效。而对于索引理解、认识层.. 阅读全文
posted @ 2012-07-13 21:58 超级塞亚人 阅读(279) 评论(0) 推荐(0)
摘要:数据库索引分为聚集索引和非聚集索引,聚集索引就是物理索引,也就是数据的物理的存储顺序,聚集索引的叶子节点就是数据行本身;非聚集索引是逻辑索引,也可以简单的认为是对聚集索引建立的索引,一般来说聚集索引的键就是非聚集索引的叶子节点(在不使用include时)。关于索引的选择 对于索引类型来说没什么好选的,一般来说聚集索引是必须的(有特殊需要的另说),非聚集索引看实际需要灵活建立。因此对于索引来说主要是决定在那些列上建立索引,尤其是对于聚集索引这点非常重要。聚集索引 聚集索引作为最重要的索引往往被我们所忽略,而其最大的优势就是大范围数据查询有着较高的效率,因此聚集索引列的选择往往对数据库性能有着.. 阅读全文
posted @ 2012-07-03 10:05 超级塞亚人 阅读(184) 评论(0) 推荐(0)