随笔分类 -  SQL

摘要:最近遇到一个情况,需要在内网系统中出一个统计报表。需要根据不同条件使用多个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 左正 阅读(234) 评论(0) 推荐(0) 编辑
摘要:简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能。但索引可以在大多数情况下大大提升查询性能,在OLAP中尤其明显.要完全理解索引的概念,需要了解大量原理性的知识,包括B树,堆,数据库页,区,填充因子,碎片,文件组等等一系列相关知识,这些知识写一本小书也不为过。所以本文并不会深入讨论这些主题。索引是什么 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。 精简来说,索引是一种结构.在SQL Server中,索引和表(这里指的是加了聚集索引的表)的存储结构是一样的,都是B树,B树是一 阅读全文
posted @ 2012-09-18 14:41 左正 阅读(285) 评论(0) 推荐(0) 编辑
摘要:写在前面:这是第一篇T-SQL查询高级系列文章.但是T-SQL查询进阶系列还远远没有写完。这个主题放到高级我想是因为这个主题需要一些进阶的知识作为基础..如果文章中有错误的地方请不吝指正.本篇文章的内容需要索引的知识作为基础。简介 在SQL SERVER中,非聚集索引其实可以看作是一个含有聚集索引的表.但相比实际的表而言.非聚集索引中所存储的表的列数要窄很多,因为非聚集索引仅仅包含原表中非聚集索引的列和指向实际物理表的指针。 并且,对于非聚集索引表来说,其中所存放的列是按照聚集索引来进行存放的.所以查找速度要快了很多。但是对于性能的榨取来说,SQL SERVER总是竭尽所能,假如仅仅是通过索. 阅读全文
posted @ 2012-09-18 14:22 左正 阅读(268) 评论(0) 推荐(0) 编辑
摘要:简介 分区表是在SQL SERVER2005之后的版本引入的特性。这个特性允许把逻辑上的一个表在物理上分为很多部分。而对于SQL SERVER2005之前版本,所谓的分区表仅仅是分布式视图,也就是多个表做union操作. 分区表在逻辑上是一个表,而物理上是多个表.这意味着从用户的角度来看,分区表和普通表是一样的。这个概念可以简单如下图所示: 而对于SQL SERVER2005之前的版本,是没有分区这个概念的,所谓的分区仅仅是分布式视图: 本篇文章所讲述的分区表指的是SQL SERVER2005之后引入的分区表特性.为什么要对表进行分区 在回答标题的问题之前,需要说明的是,表分区这个特性只有.. 阅读全文
posted @ 2012-09-18 14:11 左正 阅读(237) 评论(0) 推荐(0) 编辑
摘要:简介 Merge关键字是一个神奇的DML关键字。它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句。MSDN对于Merge的解释非常的短小精悍:”根据与源表联接的结果,对目标表执行插入、更新或删除操作。例如,根据在另一个表中找到的差异在一个表中插入、更新或删除行,可以对两个表进行同步。”,通过这个描述,我们可以看出Merge是关于对于两个表之间的数据进行操作的。 可以想象出,需要使用Merge的场景比如: 数据同步 数据转换 基于源表对目标表做Insert,Update,Delete操作使用Merge关键字的好处 首先是更加短小精悍的语句,在 阅读全文
posted @ 2012-09-18 13:46 左正 阅读(162) 评论(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 左正 阅读(215) 评论(0) 推荐(0) 编辑
摘要:简介 当查询优化器(Query Optimizer)将T-SQL语句解析后并从执行计划中选择最低消耗的执行计划后,具体的执行就会交由执行引擎(Execution Engine)来进行执行。本文旨在分类讲述执行计划中每一种操作的相关信息。数据访问操作 首先最基本的操作就是访问数据。这既可以通过直接访问表,也可以通过访问索引来进行。表内数据的组织方式分为堆(Heap)和B树,其中表中没有建立聚集索引时数据是通过堆进行组织的,这个是无序的,表中建立聚集索引后和非聚集索引的数据都是以B树方式进行组织,这种方式数据是有序存储的。通常来说,非聚集索引仅仅包含整个表的部分列,对于过滤索引,还仅仅包含部分行。 阅读全文
posted @ 2012-09-18 11:30 左正 阅读(191) 评论(0) 推荐(0) 编辑
摘要:简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理。二级存储(secondary storage) 对于计算机来说,存储体系是分层级的。离CPU越近的地方速度愉快,但容量越小(如图1所示)。比如:传统的计算机存储体系结构离CPU由近到远依次是:CPU内的寄存器,一级缓存,二级缓存,内存,硬盘。但同时离CPU越远的存储系统都会比之前的存储系统大一个数量级。比如硬盘通常要比同时代的内存大一个数量级。 图1.计算机存储体系 因此对于SQL Server来说,正常的生产系统所配置的内存通常不能装载所有. 阅读全文
posted @ 2012-09-18 11:02 左正 阅读(128) 评论(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 左正 阅读(366) 评论(0) 推荐(0) 编辑
摘要:使用UseInternalTransaction在构造函数SqlBulkCopy(String, SqlBulkCopyOptions)里面有SqlBulkCopyOptions的选项,有如下可选项。我们看到可选项分别有保持Identity键,检查约束,是否锁表,保持null值,触发触发器,使用事务。所以如果只是想把SqlBulkCopy包含在事务中,只要打开此属性即可。使用System.Data.SqlClient.SqlTransaction使用自定义的事务,将SqlBulkCopy和其他操作一起包含在一个事务中。这种方法只要使用另一个构造函数即可:SqlBulkCopy(SqlConne 阅读全文
posted @ 2012-09-18 09:56 左正 阅读(1940) 评论(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 左正 阅读(196) 评论(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 左正 阅读(243) 评论(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 左正 阅读(13085) 评论(0) 推荐(6) 编辑
摘要:曾经和一些DBA和数据库开发人员交流时,问他们都用过一些什么样的DB方面的工具,大部分人除了SSMS和Profile之外,基本就没有使用过其他工具了;诚然,SSMS和Profile足够强大,工作的大部分内容都能通过它们搞定,但是MS、第三方公司甚至是个人开发者为SQLServer提供了很多其他的工具,如果你能充分的掌握这些工具,无疑会给我们数据库的管理、优化、测试和排错节省大量的时间和精力,下面就来介绍除SSMS和Profile之外的其他有用的工具。NO1: PD(PowerDesigner)功能:SysBase公司提供的数据库设计工具,功能很强大,是做数据库设计时必备的工具;下载:http: 阅读全文
posted @ 2012-09-18 09:33 左正 阅读(214) 评论(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 左正 阅读(303) 评论(0) 推荐(0) 编辑
摘要:如何提高SQL Server数据库的性能,该从哪里入手呢?笔者认为,该遵循从外到内的顺序,来改善数据库的运行性能。如下图: 第一层:网络环境 到企业碰到数据库反映速度比较慢时,首先想到的是是否是网络环境所造成的。而不是一开始就想着如何去提高数据库的性能。这是很多数据库管理员的一个误区。因为当网络环境比较恶劣时,你就算再怎么去改善数据库性能,也是枉然。 如以前有个客户,向笔者反映数据库响应时间比较长,让笔者给他们一个提高数据库性能的解决方案。那时,笔者感到很奇怪。因为据笔者所知,这家客户数据库的记录量并不是很大。而且,他们配置的数据库服务器硬件很不错。笔者为此还特意跑到他们企业去查看问题的... 阅读全文
posted @ 2012-09-15 10:34 左正 阅读(170) 评论(0) 推荐(0) 编辑
摘要:大家在写查询时,为了性能,往往会在表后面加一个nolock,或者是with(nolock),其目的就是查询是不锁定表,从而达到提高查询速度的目的。什么是并发访问:同一时间有多个用户访问同一资源,并发用户中如果有用户对资源做了修改,此时就会对其它用户产生某些不利的影响,例如:1:脏读,一个用户对一个资源做了修改,此时另外一个用户正好读取了这条被修改的记录,然后,第一个用户放弃修改,数据回到修改之前,这两个不同的结果就是脏读。2:不可重复读,一个用户的一个操作是一个事务,这个事务分两次读取同一条记录,如果第一次读取后,有另外用户修改了这个数据,然后第二次读取的数据正好是其它用户修改的数据,这样造成 阅读全文
posted @ 2012-09-15 10:28 左正 阅读(306) 评论(0) 推荐(0) 编辑
摘要:我们做软件开发的,大部分人都离不开跟数据库打交道,特别是erp开发的,跟数据库打交道更是频繁,存储过程动不动就是上千行,如果数据量大,人员流动大,那么我么还能保证下一段时间系统还能流畅的运行吗?我么还能保证下一个人能看懂我么的存储过程吗?那么我结合公司平时的培训和平时个人工作经验和大家分享一下,希望对大家有帮助。 要知道SQL语句,我想我们有必要知道SQL Server查询分析器怎么执行我们的SQL语句的,我们很多人会看执行计划,或者用Profiler来监视和调优查询语句或者存储过程慢的原因,但是如果我们知道查询分析器的执行逻辑顺序,下手的时候就胸有成竹,那么下手是不是有把握点呢? 一、查.. 阅读全文
posted @ 2012-09-15 09:18 左正 阅读(182) 评论(0) 推荐(0) 编辑
摘要:虽然查询速度慢的原因很多,但是如果通过一定的优化,也可以使查询问题得到一定程度的解决。 查询速度慢的原因很多,常见如下几种:没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)I/O吞吐量小,形成了瓶颈效应。没有创建计算列导致查询不优化。内存不足网络速度慢查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)sp_lock, sp_who, 活动的用户查看,原因是读写竞争资源。返回了不必要的行和列查询语句不好,没有优化 可以通过如下方法来优化查询 :把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以.. 阅读全文
posted @ 2012-09-14 14:37 左正 阅读(240) 评论(0) 推荐(0) 编辑
摘要:先分3点从全局来看对操作系统的安全需求:防止对DBMS的非法访问和修改,保护存储的数据、文件的安全性,对数据库用户的认证 对数据库系统本身的安全需求:用户认证管理、访问控制、审计,数据库的稳定性,保证数据的安全性与完整性,完善的恢复功能,数据加密 对数据库应用系统的安全需求:访问控制、认证管理,对数据库的保护防止非法访问和修改,自身的稳定性举一个实例SQL注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,这是SQL注入的标准释义。 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中 阅读全文
posted @ 2012-09-14 14:06 左正 阅读(388) 评论(0) 推荐(0) 编辑