摘要:        
概述游标是邪恶的!在关系数据库中,我们对于查询的思考是面向集合的。而游标打破了这一规则,游标使得我们思考方式变为逐行进行.对于类C的开发人员来着,这样的思考方式会更加舒服。正常面向集合的思维方式是:而对于游标来说:这也是为什么游标是邪恶的,它会使开发人员变懒,懒得去想用面向集合的查询方式实现某些功能.同样的,在性能上,游标会吃更多的内存,减少可用的并发,占用宽带,锁定资源,当然还有更多的代码量……从游标对数据库的读取方式来说,不难看出游标为什么占用更多的资源,打个比方:当你从ATM取钱的时候,是一次取1000效率更高呢,还是取10次100?既然游标这么“邪恶”,为什么还要学习游标我个人认为存在    阅读全文
posted @ 2012-09-18 15:58
左正
阅读(1207)
评论(0)
推荐(0)
        
            
        
        
摘要:        
简介 对于SELECT查询语句来说,通常情况下,为了使T-SQL代码更加简洁和可读,在一个查询中引用另外的结果集都是通过视图而不是子查询来进行分解的.但是,视图是作为系统对象存在数据库中,那对于结果集仅仅需要在存储过程或是用户自定义函数中使用一次的时候,使用视图就显得有些奢侈了. 公用表表达式(Common Table Expression)是SQL SERVER 2005版本之后引入的一个特性.CTE可以看作是一个临时的结果集,可以在接下来的一个SELECT,INSERT,UPDATE,DELETE,MERGE语句中被多次引用。使用公用表达式可以让语句更加清晰简练. 除此之外,根据微软对CT    阅读全文
posted @ 2012-09-18 15:11
左正
阅读(332)
评论(0)
推荐(0)
        
            
        
        
摘要:        
最近遇到一个情况,需要在内网系统中出一个统计报表。需要根据不同条件使用多个group by语句.需要将所有聚合的数据进行UNION操作来完成不同维度的统计查看. 直到发现在SQL SERVER 2008之后引入了GROUPING SETS这个对于GROUP BY的增强后,上面的需求实现起来就简单多了,下面我用AdventureWork中的表作为DEMO来解释一下GROUPING SETS. 假设我现在需要两个维度查询我的销售订单,查询T-SQL如下: 而使用SQL SERVER 2008之后新增的GROUPING SETS语句,仅仅需要这样写: 值得注意的是,虽然上面使用GROUPING ..    阅读全文
posted @ 2012-09-18 14:57
左正
阅读(244)
评论(0)
推荐(0)
        
            
        
        
摘要:        
简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能。但索引可以在大多数情况下大大提升查询性能,在OLAP中尤其明显.要完全理解索引的概念,需要了解大量原理性的知识,包括B树,堆,数据库页,区,填充因子,碎片,文件组等等一系列相关知识,这些知识写一本小书也不为过。所以本文并不会深入讨论这些主题。索引是什么 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。 精简来说,索引是一种结构.在SQL Server中,索引和表(这里指的是加了聚集索引的表)的存储结构是一样的,都是B树,B树是一    阅读全文
posted @ 2012-09-18 14:41
左正
阅读(307)
评论(0)
推荐(0)
        
            
        
        
摘要:        
写在前面:这是第一篇T-SQL查询高级系列文章.但是T-SQL查询进阶系列还远远没有写完。这个主题放到高级我想是因为这个主题需要一些进阶的知识作为基础..如果文章中有错误的地方请不吝指正.本篇文章的内容需要索引的知识作为基础。简介 在SQL SERVER中,非聚集索引其实可以看作是一个含有聚集索引的表.但相比实际的表而言.非聚集索引中所存储的表的列数要窄很多,因为非聚集索引仅仅包含原表中非聚集索引的列和指向实际物理表的指针。 并且,对于非聚集索引表来说,其中所存放的列是按照聚集索引来进行存放的.所以查找速度要快了很多。但是对于性能的榨取来说,SQL SERVER总是竭尽所能,假如仅仅是通过索.    阅读全文
posted @ 2012-09-18 14:22
左正
阅读(282)
评论(0)
推荐(0)
        
            
        
        
摘要:        
简介 分区表是在SQL SERVER2005之后的版本引入的特性。这个特性允许把逻辑上的一个表在物理上分为很多部分。而对于SQL SERVER2005之前版本,所谓的分区表仅仅是分布式视图,也就是多个表做union操作. 分区表在逻辑上是一个表,而物理上是多个表.这意味着从用户的角度来看,分区表和普通表是一样的。这个概念可以简单如下图所示: 而对于SQL SERVER2005之前的版本,是没有分区这个概念的,所谓的分区仅仅是分布式视图: 本篇文章所讲述的分区表指的是SQL SERVER2005之后引入的分区表特性.为什么要对表进行分区 在回答标题的问题之前,需要说明的是,表分区这个特性只有..    阅读全文
posted @ 2012-09-18 14:11
左正
阅读(253)
评论(0)
推荐(0)
        
            
        
        
摘要:        
简介 Merge关键字是一个神奇的DML关键字。它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句。MSDN对于Merge的解释非常的短小精悍:”根据与源表联接的结果,对目标表执行插入、更新或删除操作。例如,根据在另一个表中找到的差异在一个表中插入、更新或删除行,可以对两个表进行同步。”,通过这个描述,我们可以看出Merge是关于对于两个表之间的数据进行操作的。 可以想象出,需要使用Merge的场景比如: 数据同步 数据转换 基于源表对目标表做Insert,Update,Delete操作使用Merge关键字的好处 首先是更加短小精悍的语句,在    阅读全文
posted @ 2012-09-18 13:46
左正
阅读(172)
评论(0)
推荐(0)
        
            
        
        
摘要:        
在我的上一篇关于SQL SERVER索引的博文,有圆友问道关于逻辑读,预读和物理读的概念.我觉的还是写一篇博文能把这个问题解释清楚。SQL SERVER数据存储的形式 在谈到几种不同的读取方式之前,首先要理解SQL SERVER数据存储的方式.SQL SERVER存储的最小单位为页(Page).每一页大小为8k,SQL SERVER对于页的读取是原子性,要么读完一页,要么完全不读,不会有中间状态。而页之间的数据组织结构为B树(请参考我之前的博文).所以SQL SERVER对于逻辑读,预读,和物理读的单位是页. SQL SERVER一页的总大小为:8K 但是这一页存储的数据会是:8K=8192.    阅读全文
posted @ 2012-09-18 11:40
左正
阅读(228)
评论(0)
推荐(0)
        
            
        
        
摘要:        
简介 当查询优化器(Query Optimizer)将T-SQL语句解析后并从执行计划中选择最低消耗的执行计划后,具体的执行就会交由执行引擎(Execution Engine)来进行执行。本文旨在分类讲述执行计划中每一种操作的相关信息。数据访问操作 首先最基本的操作就是访问数据。这既可以通过直接访问表,也可以通过访问索引来进行。表内数据的组织方式分为堆(Heap)和B树,其中表中没有建立聚集索引时数据是通过堆进行组织的,这个是无序的,表中建立聚集索引后和非聚集索引的数据都是以B树方式进行组织,这种方式数据是有序存储的。通常来说,非聚集索引仅仅包含整个表的部分列,对于过滤索引,还仅仅包含部分行。    阅读全文
posted @ 2012-09-18 11:30
左正
阅读(201)
评论(0)
推荐(0)
        
            
        
        
摘要:        
简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理。二级存储(secondary storage) 对于计算机来说,存储体系是分层级的。离CPU越近的地方速度愉快,但容量越小(如图1所示)。比如:传统的计算机存储体系结构离CPU由近到远依次是:CPU内的寄存器,一级缓存,二级缓存,内存,硬盘。但同时离CPU越远的存储系统都会比之前的存储系统大一个数量级。比如硬盘通常要比同时代的内存大一个数量级。 图1.计算机存储体系 因此对于SQL Server来说,正常的生产系统所配置的内存通常不能装载所有.    阅读全文
posted @ 2012-09-18 11:02
左正
阅读(137)
评论(0)
推荐(0)
        
            
        
        
摘要:        
bulk方法主要思想是通过在客户端把数据都缓存在Table中,然后利用SqlBulkCopy一次性把Table中的数据插入到数据库代码如下:public static void BulkToDB(DataTable dt) { SqlConnection sqlConn = new SqlConnection( ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString); SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn); bulkCopy.Destin    阅读全文
posted @ 2012-09-18 10:15
左正
阅读(371)
评论(0)
推荐(0)
        
            
        
        
摘要:        
使用UseInternalTransaction在构造函数SqlBulkCopy(String, SqlBulkCopyOptions)里面有SqlBulkCopyOptions的选项,有如下可选项。我们看到可选项分别有保持Identity键,检查约束,是否锁表,保持null值,触发触发器,使用事务。所以如果只是想把SqlBulkCopy包含在事务中,只要打开此属性即可。使用System.Data.SqlClient.SqlTransaction使用自定义的事务,将SqlBulkCopy和其他操作一起包含在一个事务中。这种方法只要使用另一个构造函数即可:SqlBulkCopy(SqlConne    阅读全文
posted @ 2012-09-18 09:56
左正
阅读(1966)
评论(0)
推荐(0)
        
            
        
        
摘要:        
直接在 SQLQuery 执行下就好了。CREATE TYPE [dbo].[D_bigint(8)] FROM [bigint] NULLCREATE TYPE [dbo].[D_bit] FROM [bit] NULLCREATE TYPE [dbo].[D_datetime(8)] FROM [datetime] NULLCREATE TYPE [dbo].[D_int(4)] FROM [int] NULLCREATE TYPE [dbo].[D_text] FROM [text] NULLCREATE TYPE [dbo].[D_varchar(10)] FROM [varchar]    阅读全文
posted @ 2012-09-18 09:43
左正
阅读(207)
评论(0)
推荐(0)
        
            
        
        
摘要:        
最近遇到一个行转列的问题,给定一个时间段,统计每天每个车的签到情况,用动态拼接的方法实现,受Varchar(8000)的影响,拼接的SQL语句不能太长,遇到这种动态列头的问题,这种方法肯定不是很好,希望有高人指点新招~/*建立车信息表*/goif NOT EXISTS (select 1 from sysobjects where id = object_id('Car') AND type='U')BEGIN CREATE TABLE Car ( Carid UNIQUEIDENTIFIER , CarName VARCHAR(100) )endgo...    阅读全文
posted @ 2012-09-18 09:42
左正
阅读(253)
评论(0)
推荐(0)
        
            
        
        
摘要:        
在工作当中会经常用到递归,比如菜单的展示。一种方法就是从数据库中取出所有的数据,然后在程序中循环获取符合条件的数据。另外一种方法就是使用SQL直接读取符合条件的数据。对于递归查询,T-SQL和PL/SQL进行了不同的处理。以表Deparment为例表结构为:Id 部门内码,DeptCode 部门编码,ParentDeptId 上级部门内码使用T-SQL:with Dep as ( select Id,DeptCode,DeptName from Department where Id=1 union all select d.Id,d.DeptCode,d.DeptNa...    阅读全文
posted @ 2012-09-18 09:36
左正
阅读(13131)
评论(0)
推荐(6)
        
            
        
        
摘要:        
曾经和一些DBA和数据库开发人员交流时,问他们都用过一些什么样的DB方面的工具,大部分人除了SSMS和Profile之外,基本就没有使用过其他工具了;诚然,SSMS和Profile足够强大,工作的大部分内容都能通过它们搞定,但是MS、第三方公司甚至是个人开发者为SQLServer提供了很多其他的工具,如果你能充分的掌握这些工具,无疑会给我们数据库的管理、优化、测试和排错节省大量的时间和精力,下面就来介绍除SSMS和Profile之外的其他有用的工具。NO1: PD(PowerDesigner)功能:SysBase公司提供的数据库设计工具,功能很强大,是做数据库设计时必备的工具;下载:http:    阅读全文
posted @ 2012-09-18 09:33
左正
阅读(229)
评论(0)
推荐(0)
        
            
        
        
摘要:        
临时表或表变量我们一般用来充当中间结果集,很多时候都在用,但真正了解他们之间的区别的人还是很少的,网上流传的说法也不甚统一,所以今天我就做一个实验,让我们看看临时表和表变量的区别,以及他们各自的用途。执行以下语句,对测试环境做准备DBCC DROPCLEANBUFFERS --从缓冲池中删除所有清除缓冲区DBCC FREEPROCCACHE --清除计划缓存CHECKPOINT --写入MDF中1) 关于存储表变量在内存中,是否真的不写磁盘,不会造成任何IO开销?use tempdb exec sp_spaceused--database_name database_siz...    阅读全文
posted @ 2012-09-18 09:08
左正
阅读(311)
评论(0)
推荐(0)
        
                    
                
浙公网安备 33010602011771号