随笔分类 - SQL Server
摘要:在考虑采取优化行动之前(比如添加索引或非范式化),应该知道当前的查询是怎样被处理的,还应该有一些性能测量基线,这样才能比较改动前后的性能。SQL Server提供了一些工具(SET 选项)来支持对查询性能的监测;IO统计TIME统计PROFILE统计XML统计在执行查询前启用SET选项,他们会产生相...
阅读全文
摘要:USE tempdbGOSET NOCOUNT ON--创建表结构IF OBJECT_ID(N'ClassB', N'U') IS NOT NULL DROP TABLE ClassBGOCREATE TABLE ClassB(ID INT PRIMARY KEY, Name VARCHAR(...
阅读全文
摘要:在开始之前搭建演示环境:USE masterGOSET NOCOUNT ON--创建表结构IF OBJECT_ID(N'ClassA', N'U') IS NOT NULL DROP TABLE ClassACREATE TABLE ClassA(ID INT PRIMARY KEY, Nam...
阅读全文
摘要:分配单元是堆或 B 树内用于根据页类型管理数据的页集合。下表列出了用于管理表和索引中的数据的分配单元类型。分配单元类型用途页类型IN_ROW_DATA包含除大型对象 (LOB) 数据以外的所有数据的数据行或索引行。Data/ImageLOB_DATA以下列一种或多种数据类型存储的大型对象数据:tex...
阅读全文
摘要:SQL Server性能优化的一些常用脚本,适用于SQL Server 2008,更高的版本某些系统表的字段有所不同,建议参考MSDN。死锁相关/****************************************1. 查询当前DB的锁分配情况Phoenix.Feng 2012-12-0...
阅读全文
摘要:表1结构及数据1USEtestdb2GO3/****************************************4堆存储_015Phoenix.Feng2010-11-186****************************************/7IFOBJECT_ID('ID...
阅读全文
摘要:子查询是强有力的工具,它可以书写许多表达式和许多复杂的查询。有很多不同类型的子查询和很多使用子查询的不同方式。子查询是基本的连接。然而,一些子查询产生更复杂的连接使用非常不同寻常的连接特性。在讨论具体例子之前,可以从不同方面对子查询进行分类。子查询采用3种计划来进行分类。l 不相关 vs 相关子查询。不相关子查询不依赖外部查询,可以独立于外部查询而被评估,并且为外部查询的每一行返回相同的结果。只能从外部查询的上下文中来被估计,并且可能为外部查询的每一行返回不同的结果。l 标量 vs 多行子查询。标量子查询返回或期望返回单一行(也就是单行),然而,多行子查询可能返回一个结果集。l 有子查询出现的
阅读全文
摘要:前面几篇文章作为自己的读书笔记(SQLServer 2005技术内幕:查询、调整和优化),基本都是书上的内容,没敢放在首页上。现在学习SQL Server都是理论知识,自己有个习惯,一直看理论看下去不容易吸收,所以看到“聚合”这一节决定写写代码,用来加深对SQL Server执行计划的理解。首先看看我在在SQL Server中是怎么处理连接查询和分组查询的。代码Code h...
阅读全文
摘要:对于聚合,SQL Server支持两种物理操作符:流聚合与哈希聚合。标量聚合标量聚合通过在选择列表中没有GROUP BY语句的聚合函数查询。标量聚合总是返回一个单一的行。SQL Server总是使用流聚合操作符实现标量聚合。下面是个简单的例子:[代码]这个查询产生下面的计划:流聚合操作符就是计算输入行的大小并返回结果。流聚合实际计算Bigint的总数([Expro1004])。计算的数量需要把这个...
阅读全文
摘要:连接SQL Server支持三种物理连接运算符:嵌套循环连接、合并连接及哈希连接。在bookmark lookup示例中,已经接触了嵌套循环连接。没有最好的连接运算符,而且没有连接运算符好或不好。每一个连接运算符在正确的环境都会执行的很好,在错误的环境都会执行的不好。嵌套循环连接 嵌套循环连接是最简单和最基础的连接方式。它对一个表(外表)的每行和另外一个表(称为内行)的每行比较,寻找满足谓词连接的...
阅读全文
摘要:根据上篇知道非聚集索引不能覆盖表中所有的列。假设在非聚集索引关键字中有一个带有谓词的查询用来选择没有被索引覆盖的列。如果SQL Server在非聚集索引中进行查找,会丢掉一些必须的列。反之,如果在聚集索引中进行查找,会丢掉一些必须的列。反之,如果在聚集索引中进行扫描,则会获取所有的列。反之,如果在聚集索引中进行扫描,则会获取所有的列。但这要涉及表中的每一行,从而影响效率。例如下面这个查询。[代码]...
阅读全文
摘要:闲话少说,切入正题,扫描和查找时从表和索引中读取数据的迭代器,作为SQL Sever中所支持的最基本的迭代器,几乎会在每一个查询计划中出现。一定要区分扫描和查找之间的不同,扫描是用来处理整个表和索引的全部分支;查找时在谓词的基础上有效的返回索引中的一个或多个范围中的行。首先是关于扫描的示例,如下所示:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->select[orderId]from[Orders]Owhere[RequiredDate]=
阅读全文
摘要:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->IFEXISTS(SELECT1FROMsysobjectsA,syscolumnsBWHEREA.id=B.idANDA.[name]='sys_Module'ANDB.[name]='M_ShowType')ALTERTABLEsys_ModuleDROPCOLUMNM_ShowTypealtertablesys_ModuleaddM_ShowTypeint
阅读全文
摘要:(转至CSDN-爱新觉罗.毓华)坚持SQL Server的学习, 列转行这个也是比较常见SQL操作本人愚见, 总结出来具有以下条件的情况下可能会出现此需求: 一个表中某一个列值依赖于该表中两个或多个列(如下表中的成绩依赖于学生和课程), 好像这种情况违反了数据库设计的第一范式(1NF), 哈哈!今天CSDN上无意看到一个比较全面的列转行, 但是以前没怎么接触心里就有种恐惧,现在系统的学习下,避免以...
阅读全文
摘要:这里主要演示3个运算词,UNION, EXCEPT 和 INTERSECT这三个放在一起是有理由的,因为他们都是操作两个或多个结果集,并且这些结果集有如下限制:所有查询中的列数和列的顺序必须相同.数据类型必须兼容. 并且它们都是处理于多个结果集中有重复数据的问题首先还是创建测试环境[代码]两个表的初始结果如下非常简单的两个表,列数和列顺序一样. 而数据中有一条数据相同,这里的相同时完全相同,包括主...
阅读全文
摘要:几个月前面试第一次遇到这种题目大意是每行记录的某一列和下一行记录的某列之和,做为一个新列保存到结果集中,以此类推现在想想,竟然是如此的简单,并且实现方式不仅一种![代码]先看看结果如下新结果集的第三列是id小于当前行id的所有price之和,这好像跟普通的查询没有什么区别,只是子查询中查询的对象是本身,让人有点不太习惯,就好像递归一样,自己调用自己,如果下次面试遇到这种题目,一定会正确的完成,哈哈...
阅读全文