在SQL Server里,你有没有想进行跨越多个列/纬度的聚集操作,不使用SSAS许可(SQL Server分析服务).我不是说在生产里使用开发版,也不是说安装盗版SQL Server. 不可能的任务?未必,因为通过SQL Server里所谓的Grouping Sets就可以.在这篇文章里我会给你概括介绍下Grouping Sets,使用它们可以实现哪类查询,什么是它们的性能优势. 使用Grouping Sets的聚合 假设你有个订单表,你想进行跨多个分组的T-SQL聚集查询.在Adventur…
在SQL Server里,你有没有想进行跨越多个列/纬度的聚集操作,不使用SSAS许可(SQL Server分析服务).我不是说在生产里使用开发版,也不是说安装盗版SQL Server. 不可能的任务?未必,因为通过SQL Server里所谓的Grouping Sets就可以.在这篇文章里我会给你概括介绍下Grouping Sets,使用它们可以实现哪类查询,什么是它们的性能优势. 使用Grouping Sets的聚合 假设你有个订单表,你想进行跨多个分组的T-SQL聚集查询.在Adventur…
在今天的文章里我想讨论下SQL Server里一个特别的T-SQL语言结构——自SQL Server 2005引入的PIVOT运算符.我经常引用这个与语言结构是SQL Server里最危险的一个——很快你就会知道为什么.在我们进入特定问题和陷阱前,首先我想给你下使用SQL Server里的PIVOT能实现什么的一个基本概述. 概述 SQL Server里PIVOT运算符背后的基本思想是在T-SQL查询期间,你可以旋转行为列.运算符本身是SQL Server 2005后引入的,主要用在基于建立在实…
平常我不知道被问了几次这样的问题:“SQL  Server里在文件组间如何移动数据?“你意识到这个问题:你只有一个主文件组的默认配置,后来围观了“SQL Server里的文件和文件组”后,你知道,有多个文件的自定义文件组会是个更好的主意.但你现在如何从主文件组里移动现有数据到新加的文件组? 这篇文章的目的是向你展示你如何在文件组间移动数据.首先我会谈下聚集和非聚集索引,然后我会谈下如何在堆表里移动数据.让我们开始吧! 移动聚集和非聚集索引 一般来说在你的表上通常应该有一个聚集索引.有了现存的聚集…
在今天的文章里,我想谈下SQL Server里非常重要的话题:SQL Server如何处理文件的文件组.当你用CREATE DATABASE命令创建一个简单的数据库时,SQL Server为你创建2个文件: 一个数据文件(.mdf) 一个事务日志文件(.ldf) 数据文件本身在有且只有一个主文件组里创建.默认情况下,在主文件组里,SQL Server存储素有的数据(用户表,系统表等).那有额外的文件和文件组的目的是什么?我们来看下. 多个文件组 当你为你的数据创建额外的文件组,你可以在它们里面存…
在1年前,我写了篇在SQL Server里为什么我们需要更新锁.今天我想继续这个讨论,谈下SQL Server里的意向锁,还有为什么需要它们. SQL Server里的锁层级 当我讨论SQL Server里的锁升级时,我从SQL Server使用的锁层级开始题,在你读或修改你的数据的时候. 当你读取一条记录时,SQL Server默认请求一个共享锁(S),当你修改一条记录时,SQL Server请求一个排它锁(X).这2个锁彼此不兼容,当你同时向读写一条记录时,会发生阻塞. 另外对于行级别的锁,…
在今天的文章里我想谈下SQL Server使用的更高级的,轻量级的同步对象:闩锁(Latch).闩锁是SQL Server存储引擎使用轻量级同步对象,用来保护多线程访问内存内结构.文章的第1部分我会介绍SQL Server里为什么需要闩锁,在第2部分我会给你介绍各个闩锁类型,还有你如何能对它们进行故障排除. 为什么我们需要闩锁? 闩锁首次在SQL Server 7.0里引入,同时微软首次引入了行级别锁(row-level locking).对于行级别锁引入闩锁的概念是非常重要的,不然的话在内存中…
今天我想讲解一个特别的问题,在我每次讲解SQL Server里的锁和阻塞(Locking & Blocking)都会碰到的问题:在SQL Server里,为什么我们需要更新锁?在我们讲解具体需要的原因前,首先我想给你介绍下当更新锁(Update(U)Lock)获得时,根据它的兼容性锁本身是如何应对的. 一般来说,当执行UPDATE语句时,SQL Server会用到更新锁(Update Lock).如果你查看对应的执行计划,你会看到它包含3个部分 读取数据 计算新值 写入数据 在查询计划的第1部分…
在今天的文章里我想谈下每个DBA应该知道的一个重要话题:在SQL Server里如何进行页级别还原操作.假设在SQL Server里你有一个损坏的页,你要从最近的数据库备份只还原有问题的页,而不是还原整个数据库. 我们来破坏一个页 第一步我想向你展示下如何建立表(或索引)里有个特定页损坏的情景,这里我们会进行一些魔术,因为开箱即用(out-of-box)的SQL Server本身不会引入任何损坏的页(如果有的话,恭喜你找到了一个BUG).我们从创建一个新的数据库,往新建的表插入一些记录开始. U…
几天前,我写了篇SQL Server里简单参数化的痛苦.今天我想继续这个话题,谈下SQL Server里强制参数化(Forced Parameterization). 强制参数化(Forced Parameterization) 在SQL Server里简单参数化有很多限制,如果你的SQL语句包含下列任意它不会发生: JOIN IN BULK INSERT UNION INTO DISTINCT TOP GROUP BY HAVING COMPUTE Sub Queries 如果你还想让SQL…
在今天的文章里,我想谈下SQL Server里非常有争议和复杂的话题:ORDER BY子句的歧义性. 视图与ORDER BY 我们用一个非常简单的SELECT语句开始. -- A very simple SELECT statement SELECT * FROM Person.Person ORDER BY LastName GO 从刚才列出的代码你可以看到,我们只想从Person.Person表以LastName列排序返回记录.因为我们想能尽可能简单的重用那个SQL语句,最后我们把它放到视图…
在今天的文章里我想详细谈下SQL Server里的统计等待(Wait Statistics),还有她们如何帮助你立即为什么你的SQL Server当前很慢.一提到性能调优,对我来说统计等待是SQL Server了最重要的概念. 查询为什么等待 在SQL Server里每次你执行1个查询,查询总需要等待.什么?查询总需要等待?是的,你没有看错:但给你执行1个查询时,查询总需要等待.为什么查询需要等待的原因是SQL Server通过所谓的等待统计(Wait Statistics)来跟踪的.在我进入等…
在上一篇文章里,我讨论了INTERSECT设置操作的基础,它和INNER JOIN的区别,还有为什么需要好的索引设计支持.今天我想谈下SQL Server里并未实现的INTERSECT ALL操作. INTERSECT ALL是SQL特性的一部分,但SQL Server并不考虑它.和INTERSECT操作的区别非常简单:INTERSECT ALL不会剔除重复行.在SQL Server里的好处是你可以模拟INTERSECT ALL.我们来试下,再次创建2个表,并插入一些行. -- Create t…
在今天的文章里,我想讨论下SQL Server里的INTERSECT设置操作.INTERSECT设置操作彼此交叉2个记录集,返回2个集里列值一样的记录.下图演示了这个概念. INTERSECT与INNER JOIN 你会发现,它和2个表间的INNER JOIN几乎一样.但今天我会介绍它们之间的一些重要区别.让我们从创建作为输入的2个简单表开始. -- Create the 1st table CREATE TABLE t1 ( Col1 INT, Col2 INT, Col3 INT ) GO…
在今天的文章里我想演示下SQL Server里在表上丢失索引如何引起死锁(deadlock)的.为了准备测试场景,下列代码会创建2个表,然后2个表都插入4条记录. -- Create a table without any indexes CREATE TABLE Table1 ( Column1 INT, Column2 INT ) GO -- Insert a few record , ) , ) , ) , ) GO -- Create a table without any indexe…
在上一篇文章里我讨论了SQL Server里的闩锁.在文章的最后我给你简单介绍了下自旋锁(Spinlock).基于那个基础,今天我会继续讨论SQL Server中的自旋锁,还有给你展示下如何对它们进行故障排除. 为什么我们需要自旋锁? 在上篇文章我已经指出,用闩锁同步多个线程间数据结构访问,在每个共享数据结构前都放置一个闩锁没有意义的.闩锁与此紧密关联:当你不能获得闩锁(因为其他人已经有一个不兼容的闩锁拿到),查询就会强制等待,并进入挂起(SUSPENDED)状态.查询在挂起状态等待直到可以拿到…
今天的文章,我想给你简单介绍下SQL Server里如何随机记录集. SELECT * FROM Person.Person ORDER BY NEWID() GO 这会引入新的UNIQUEIDENTIFIER数据类型列,SQL Server会在那列上进行物理排序操作. 但是在记录集里列本身没有返回,因为ORDER BY子句在查询SELECT部分逻辑后发生,因此也不会改变记录集. 在SQL Server里,简单但很强大的方法用来随机化你的记录集. 感谢关注!…
SQL Server里一些未公开的扩展存储过程 [转帖] 博客天地 www.inbaidu.com SQL Server里一些未公开的扩展存储过程 扩展存储过程(xp)是直接运行在SQL Server地址空间里的动态链接库,是通过使用SQL Server开放数据服务API(SQL Server Open Data Services API)开发的.我们可以像执行普通存储过程一样,在“查询分析器”里运行扩展存储过程.扩展存储过程被用于SQL Server的扩展功能,我们可以直接利用SQL Serv…
在今天的文章里,我想谈下SQL Server里如何处理死锁.当2个查询彼此等待时会发生死锁,没有一个查询可以继续它们的操作.首先我想给你大致讲下SQL Server如何处理死锁.最后我会展示下SQL Sever里特定的死锁类型,还有你如何避免和解决它们. 死锁处理 死锁的好处是SQL Server自动检测并解决它们.为了解决死锁,SQL Server需要回滚2个事务中最便宜的那个.在SQL Server上下文中,最便宜的事务是写入事务日志更少字节的那个. SQL Server在后台进程中实现死锁…
在今天的文章里,我想谈下SQL Server里如何处理死锁.当2个查询彼此等待时会发生死锁,没有一个查询可以继续它们的操作.首先我想给你大致讲下SQL Server如何处理死锁.最后我会展示下SQL Sever里特定的死锁类型,还有你如何避免和解决它们. 死锁处理 死锁的好处是SQL Server自动检测并解决它们.为了解决死锁,SQL Server需要回滚2个事务中最便宜的那个.在SQL Server上下文中,最便宜的事务是写入事务日志更少字节的那个. SQL Server在后台进程中实现死锁…
在SQL Server里如何进行页级别的恢复 关键词:数据页修复 在今天的文章里我想谈下每个DBA应该知道的一个重要话题:在SQL Server里如何进行页级别还原操作.假设在SQL Server里你有一个损坏的页,你要从最近的数据库备份只还原有问题的页,而不是还原整个数据库. 我们来破坏一个页 第一步我想向你展示下如何建立表(或索引)里有个特定页损坏的情景,这里我们会进行一些魔术,因为开箱即用(out-of-box)的SQL Server本身不会引入任何损坏的页(如果有的话,恭喜你找到了一个B…
转自:https://www.cnblogs.com/woodytu/p/5821827.html 参考:https://www.sqlskills.com/blogs/paul/files-and-filegroups-survey-results/ 概要 那么你应该有多少个数据文件和文件组?没有正确的答案,而且甜蜜的地方会因你而异. 一些一般的经验法则: 随着数据库变大,您将更需要多个文件和文件组 多个文件组为您提供增强的可能性,以实现有针对性的灾难恢复,更轻松的可管理性和I / O子系统布…
http://www.cnblogs.com/woodytu/p/6437049.html 在今天的文章里,我想谈下SQL Server里如何处理死锁.当2个查询彼此等待时会发生死锁,没有一个查询可以继续它们的操作.首先我想给你大致讲下SQL Server如何处理死锁.最后我会展示下SQL Sever里特定的死锁类型,还有你如何避免和解决它们. 死锁处理 死锁的好处是SQL Server自动检测并解决它们.为了解决死锁,SQL Server需要回滚2个事务中最便宜的那个.在SQL Server上…
在我的博客上,以前我经常谈到SQL Serverl里的书签查找,还有它们带来的很多问题.在今天的文章里,我想从性能角度进一步谈下书签查找,还有它们如何拉低你整个SQL Server性能. 书签查找——反复循环 如果你的非聚集索引不是个覆盖非聚集索引,SQL Server的查询优化器会引入书签查找.对于从非聚集索引你返回的每一行,SQL Server需要在聚集索引里或堆表里进行额外的查找操作. 例如当你的的聚集索引包含3层,为了返回必要的信息,对于每一行,你需要3页额外的读取.因此,查询优化器再执…
几年前,我写了篇关于闩锁和为什么SQL Server需要它们的文章.在今天的文章里,我想进一步谈下非缓存区闩锁(Non-Buffer Latches),还有在索引查找操作期间,SQL Server如何使用它们.在这里你会学到称为闩锁耦合(Latch Coupling)的概念. 索引查找操作(Index Seek Operations) 正如你知道的,SQL Server使用扫描(Scan)和查找(Seek)操作在索引(聚集和非聚集索引)里访问数据.这里的查找操作使用B树的导航结构在叶子节点查找特…
在今天的文章里,我想谈下对于即席SQL语句(ad-hoc SQL statements),SQL Server使用的简单参数化(Simple Parameterization)的一些特性和副作用.首先,如果你的SQL语句包含这些,简单参数化不会发生: JOIN IN BULK INSERT UNION INTO DISTINCT TOP GROUP BY HAVING COMPUTE Sub Queries 一般来说,如果你处理所谓的安全执行计划(Safe Execution Plan),SQL…
SQL Server 2012对EXECUTE子句引入了WITH RESULT SETS选项,用于对EXECUTE语句执行的存储过程或者动态语句结果进行一个指定数据类型的转换,这样可以避免一种情况就是需要用临时表存储后再转换成目标表的数据字段类型,或者需要用OPENQUERY去转换. 用法: IF EXISTS(SELECT * FROM sys.procedures WHERE name = 'usp_TestWithResultSets' AND schema_id = schema_id(…
有人问了我一个最有意思的问题:“你能禁用聚集索引么?” 对这个问题,我先是吓了一跳,因为我从未想过禁用聚集索引,因为聚集索引代表表数据,对这个最有趣问题,我立即答道:“我认为可以,但是...” 好吧,我们现在来讨论下“但是”.你禁用聚集索引,但我真的不知道SQL Server会如何反应,因此我们来试验下. (以下代码运行在AdventureWorks2008R2数据库) -- Let's disable a Clustered Index ALTER INDEX PK_Person_Busine…
实现按照不同级别分组统计 关于GROUP BY 中的GROUPING SETS,ROLLUP,CUBE 从需求的角度理解会更加容易些. 需求举例: 假如一所学校只有两个系, 每个系有两个专业, 每个专业有两个班, 须在需要一张按照不同级别统计学生人数的报表 例如: 系别 专业 班级 学生人数 1系         专业1         班级1       班级2     专业2         班级1       班级2   2系         专业1         班级1       班…
SQL Server 中有两个參数,语法:     ISNULL(check_expression, replacement_value) check_expression 与 replacement_value 数据类型必须一致     假设 check_expression 为 NULL,则返回 replacement_value 假设 check_expression 不为 NULL,则返回 check_expression NULLIF 用于检查两个表达式,语法: NULLIF(expr…