当前位置:首页 > 计算机网络 > 数据库 > Microsoft SQL Server 2008技术内幕:T-SQL查询
出版社:电子工业出版社
出版日期:2010年9月
ISBN:9787121117350
作者:本·甘(ItzikBen-Gan)
页数:608页页
章节摘录
分析执行计划 执行计划是优化器生成的用于确定如何处理一个给定查询的“工作计划”。一个计划包含一组运算符,通常按照特定的顺序来应用这些运算符。一些运算符可以在它们前面的运算符还在处理时被应用。一些运算符可能应用多次。而且,如果优化器选择了并行计划(parallel plan),那么计划的一些分支还有可能会被并行调用。在计划中,优化器负责决定查询以什么顺序来访问表、使用哪些索引和应用什么样的访问方法、使用哪种联接算法等等。实际上,对于给定的查询,优化器会评估多个执行计划,并从生成的多个计划中选择一个开销最低的计划。注意,SQL server可能不会为给定的查询生成所有可能的执行计划。如果总是要生成所有的执行计划,那么优化过程可能会太长。SQL Serer将根据一些因素(如查询所涉及到的表的长度)来计算优化过程的临界值。一种临界值是基于时间的,SQL Server不会在优化上花费比该时间临界值更长的时间。还有一种临界值是基于开销的,也就是说,如果找到一个开销比该临界值更低的计划,就认为这个计划“足够好”,这时就会停止优化,并使用该计划。 在这两本书中,会经常分析查询的执行计划。这一节和下一节(“索引优化”)将介绍相关的背景知识,帮助你理解那些涉及分析执行计划的讨论。但本节的目的不是让你熟悉所有可能的运算符,而是让你了解分析执行计划的技巧。在“索引优化”一节中将介绍与索引有关的运算符,在本书的后面还将详细解释其他的运算符,例如,与联接有关的运算符将在第7章“联接和集合运算”中介绍。图形化的执行计划 这两本书广泛使用了图形化的执行计划。在SSMS中既可以得到估计的执行计划(按Ctrl+L键),也可以在生成查询输出的同时得到实际的执行计划(按Ctrl+M键)。不过,这两种计划通常都是一样的,记住,执行计划是在查询执行之前生成的。然而,当请求估计的计划时,查询根本不会运行。很明显,有些测量数据只在运行时才能收集(例如,每个运算符返回的实际行数,以及运算符的实际执行次数)。在估计的计划中,可以看到一些估计的测量值,这些值只有在运行时才能收集到真实的数据,而实际的计划则会显示实际的数据和一些相同的估计值。 ……
前言
我以前短暂地见过几次Itzik Ben-Gan,久闻他的大名,所以很期待在PASS的一次下午会议中听他介绍如何在SQL编程中避免使用游标。很幸运,我提早到了那里,随后会议室里就挤满了人。Itzik带来了两个SQL编程问题,他用娴熟的技巧和有趣的方式,将它们轻松玩弄于股掌之间,展示了面向合集的思维是多么优雅和高效。听众们喜欢这种思维方式,我也一样,只是我从另一个角度来看待这些。因为我对SQL Server的内部机制已经有所了解,所以我能看得出来,Itzik在他的演示中已经触及了SQL Server的神经,很欣赏他能把SQL Server的一些特性转变成漂亮的解决方案。会后,我问一位听众,他的主要收获是什么,很好奇众多技术中的哪些能给他留下深刻印象。这位听众打量了我一下,稍微有些吃惊,接着只说了一句话:“这个人是个天才!”——总结得多么好的一句话。 游标问题要比它表面看起来的更加基础。它反映了两种思维方式的深刻分化,具有巨大的实际重要性。我们当中的大多数人接受的教育是,在编程时,要把一个任务细分成多个更小的步骤,按一定的顺序执行程序,进行想要的计算。但是,如果也按这种思想来处理SQL编程,那么最终只能得到平庸的结果。不仅写出来的代码非常长,难以维护,而且代码的效率不高、不灵活、不大可能进行性能优化。有效使用SQL,不是要把原来基于过程的编程技巧也扩展到SQL上来,也不仅仅是一套特殊的技巧。写好SQL,需要我们用一种不同的思维方式来处理问题,这是一种面向声明和集合的思维方式,而不是面向过程的。这就是两种思维方式的分化。 如何理解这种声明式的、面向集合的思维方式,成为一名熟练的SQL程序员?《Microsoft SQL Server 2008技术内幕:T-SQL查询》这本书把所有需要的要素综合起来,是对SQL Server开发社区的一大突出贡献。书中关于数据库范式基础的章节可以帮助你理解T-SQL这一语言思想体系的基础,体会它的潜质。从T-SQL的基础操作到最高级的功能特性,这本书详细介绍了语言本身的各个方面,所有内容都基于如何解决现实的问题来进行讲述。通过很多例子向读者演示了好的SQL应该是什么样的,其中涉及的一些通用模式,在编写应用程序时都很有可能用到。
内容概要
Itzik Ben-Gan
Itzik Ben-Gan是Solid Quality Mentors的首席顾问和创始人。他从1999年以来一直是SQL Server方面的Microsoft MVP(最有价值的专业人员)。Itzik在世界各地从事T-SQL查询、查询优化和编程相关的培训工作。Itzik是几本关于T-SQL图书的作者。他为SQL Server Magazine和MSDN撰写过很多文章,在许多业界的专题会议上发表演讲,包括Tech Ed、DevWeek、PASS和SQL Server Magazine Connections。
Lubor Kollar
Lubor Kollar 是微软公司的集团项目经理(Group Program Manager)。从1996年以来,他一直从事SQL Server的开发组织。在加入微软之前,他在IBM开发过各种DB2引擎。目前,Lubor正在领导SQL Server Customer Advisory Team(SQL CAT)从事世界范围内最具挑战性的SQL Server开发。SQL CAT负责维持客户和SQL Server新版本发行之间的密切联系。SQL CAT的另一个主要目标是传播从最先进的SQL Server开发中学习到的智慧。公众接触SQL CAT的一个主要渠道是Web网站www.sqlcat.com。
Dejan Sarka
Dejan Sarka主要从事数据库和商业智能应用方面的开发。除了做项目,他把大约一半的时间都用于教学和咨询工作。他经常在一些最重要的国际会议上发表演讲,包括PASS、TechEd和SqlDevCon。他也是微软一些区域性事件中不可或缺的人物,例如NT Conference(微软在中东欧最大的会议)。他是Slovenian SQL Server和.NET User Group的创始人。Dejan是7本关于数据库和SQL Server图书的主要作者、合著者或客串作者。 Dejan也讲授Solid Quality learning的两门课程:Data Modeling Essentials 和 Data Mining with SQL Server 2008。
Steve Kass
Steve Kass是University of Wisconsin 大学毕业的数学专业的博士,目前是Drew University大学数学系和计算机系的教授,从1988年以来一直从事教学。他于2002年成为SQL Server Microsoft MVP,为SQL Server Magazine撰写文章,在SQL Server Magazine Connections上发表演讲,是New York City区域的用户组成员。Steve已经在Complex Systems 和 the Journal of Algebra上发表过一些数学论文。
书籍目录
目录
Table of Contents
序言
I
致谢
III
前言
V
第1章 逻辑查询处理
1
1.1 逻辑查询处理的各个阶段
2
1.1.1 逻辑查询处理阶段简介
2
1.2 客户/订单场景下的查询示例
4
1.3 逻辑查询处理阶段详解
5
1.3.1 步骤1:FROM阶段
5
1.3.2 步骤2:WHERE阶段
9
1.3.3 步骤3:GROUP BY阶段
10
1.3.4 步骤4:HAVING阶段
11
1.3.5 步骤5:SELECT阶段
12
1.3.6 步骤6:排序用的ORDER BY阶段
13
1.4 逻辑查询处理的深入内容
16
1.4.1 表运算符
16
1.4.2 OVER子句
23
1.4.3 集合运算符
25
1.5 总结
26
第2章 集合论和谓词逻辑
27
2.1 自然语言表述到数学表示的转换
27
2.1.1 严格定义(well-Definedness)
28
2.1.2 相等、恒等和同一性
30
2.1.3 数学命名约定
30
2.1.4 数字
31
2.1.5 上下文
32
2.1.6 函数、参数和变量
33
2.1.7 指令和算法
34
2.2 集合论
34
2.2.1 集合的标记方法
35
2.2.2 集合的严格定义
36
2.2.3 论域
36
2.2.4 真实性
38
2.2.5 罗素悖论(Russell’s Paradox)
40
2.2.6 有序对、元组和笛卡尔积
41
2.2.7 空集
42
2.2.8 集合的特征函数
43
2.2.9 集合的基数(Cardinality)
43
2.2.10 顺序
44
2.2.11 集合运算符
47
2.2.12 集合的划分(Partition)
49
2.2.13 集合论的推广
50
2.3 谓词逻辑
50
2.3.1 编程语言中的逻辑功能
50
2.3.2 命题和谓词
51
2.3.3 排中律
53
2.3.4 与、或、非运算
53
2.3.5 逻辑等价
55
2.3.6 逻辑蕴含
55
2.3.7 量化(Quantification)
56
2.3.8 替代和推广
58
2.4 关系
59
2.4.1 自反性、对称性和传递性
59
2.5 一个实际的应用
60
2.6 总结
63
第3章 关系模型
65
3.1 关系模型简介
65
3.1.1 关系、元组和类型
65
3.1.2 关系模型:快速摘要
70
3.2 关系代数和关系计算
70
3.2.1 基本运算符
71
3.2.2 关系代数
71
3.2.3 关系演算
79
3.2.4 T-SQL支持
80
3.3 数据完整性
81
3.3.1 声明式约束
82
3.3.2 实施完整性的其他方法
84
3.4 数据库正规化和其他设计主题
86
3.4.1 解决函数依赖的范式
87
3.4.2 更高级的范式
92
3.4.3 反规范化(Denormalization)
95
3.4.4 一般化和特殊化
96
3.5 总结
98
第4章 查询优化
99
4.1 本章用到的样本数据
99
4.2 优化方法论
102
4.2.1 分析实例级别的等待
104
4.2.2 关联等待和队列
111
4.2.3 确定行动方案
112
4.2.4 细化到数据库/文件级别
113
4.2.5 细化到进程级别
115
4.2.6 优化索引和查询
132
4.3 查询优化的工具
133
4.3.1 查询执行计划的缓存
133
4.3.2 清空缓存
134
4.3.3 动态管理对象
134
4.3.4 STATISTICS IO
135
4.3.5 测量查询的运行时间
135
4.3.6 分析执行计划
136
4.3.7 提示(Hint)
144
4.3.8 跟踪/Profiler
145
4.3.9 数据库引擎优化顾问
145
4.3.10 数据收集和管理数据仓库
146
4.3.11 使用SMO来复制统计信息
146
4.4 索引优化
146
4.4.1 表和索引的结构
146
4.4.2 索引访问方法
153
4.4.3 索引策略的分析
191
4.4.4 碎片
200
4.4.5 分区
201
4.5 准备样本数据
202
4.5.1 数据准备
202
4.5.2 TABLESAMPLE
206
4.6 基于集合的方法和迭代/过程方法的比较,以及一个优化练习
208
4.7 总结
214
第5章 算法和复杂性
215
5.0.1 你有一个1夸特的硬币吗?
215
5.1 如何度量算法(How Algorithms Scale)
217
5.1.1 二次缩放(Quadratic Scaling)的一个例子
217
5.1.2 具有线性复杂度的算法
218
5.1.3 指数和超指数复杂度
218
5.1.4 次线性(sublinear)复杂度
219
5.1.5 常量复杂度
219
5.1.6 复杂度的技术定义
220
5.1.7 复杂度的比较
221
5.2 经典算法和算法策略
222
5.2.1 排序算法
223
5.2.2 字符串查找
225
5.3 一个实际的应用程序
226
5.3.1 识别测量数据的趋势
226
5.3.2 LISLP算法的复杂度
226
5.3.3 用T-SQL解决最长上升子序列的长度问题
227
5.4 总结
229
第6章 子查询、表表达式和排名函数
231
6.1 子查询
232
6.1.1 独立子查询
232
6.1.2 相关子查询
235
6.1.3 行为不当的子查询
244
6.1.4 不常用的谓词
245
6.2 表表达式(Table Expressions)
246
6.2.1 派生表
247
6.2.2 公用表表达式
249
6.3 分析排名函数
255
6.3.1 行号
257
6.3.2 排名和密集排名(Dense Rank)
271
6.3.3 组号(Tile Number)
272
6.4 数字辅助表
276
6.5 缺失范围和现有范围(也称为间断和孤岛)
279
6.5.1 缺失范围(间断)
281
6.5.2 现有范围(孤岛)
288
6.6 总结
296
第7章 联接和集合运算
297
7.1 联接
297
7.1.1 旧语法和新语法
297
7.1.2 基本联接类型
298
7.1.3 其他的联接分类
306
7.1.4 上一年度的滑动合计
317
7.1.5 联接算法
320
7.1.6 拆分元素
326
7.2 集合运算
332
7.2.1 UNION
332
7.2.2 EXCEPT
333
7.2.3 INTERSECT
334
7.2.4 集合运算的优先级
335
7.2.5 在集合运算中使用INTO
336
7.2.6 避开不支持的逻辑阶段
336
7.3 总结
338
第8章 数据聚合和透视
339
8.1 OVER 子句
339
8.2 决胜属性(Tiebreaker)
341
8.3 连续聚合
343
8.3.1 累积聚合(Cumulative Aggregation)
344
8.3.2 滑动聚合(Sliding Aggregation)
348
8.3.3 年初至今(YTD)
349
8.4 透视转换(Pivoting)
350
8.4.1 透视转换属性
350
8.4.2 关系除法
353
8.4.3 聚合数据
355
8.5 逆透视转换
357
8.6 自定义聚合
360
8.6.1 使用透视转换的自定义聚合
361
8.6.2 用户定义聚合函数(UDA,User Defined Aggregate)
362
8.6.3 专用解决方案
370
8.7 直方图(Histogram)
380
8.8 分组因子
383
8.9 分组集
385
8.9.1 样例数据
386
8.9.2 GROUPING SETS从属子句
387
8.9.3 CUBE从属子句
389
8.9.4 ROLLUP从属子句
390
8.9.5 分组集代数
392
8.9.6 GROUPING_ID函数
395
8.9.7 保存分组集
397
8.9.8 排序
399
8.10 总结
400
第9章 TOP和APPLY
401
9.1 SELECT TOP
401
9.1.1 TOP和确定性
402
9.1.2 TOP和输入表达式
403
9.1.3 TOP和修改
404
9.1.4 增强的TOP
406
9.2 APPLY
407
9.3 使用TOP和APPLY解决常见问题
408
9.3.1 每组中的TOP n
408
9.3.2 匹配当前值和前一个值
413
9.3.3 分页
416
9.3.4 随机行
419
9.3.5 中值(Median)
421
9.4 逻辑转换
422
9.5 总结
424
第10章 数据修改
425
10.1 插入数据
425
10.1.1 增强的VALUES子句
425
10.1.2 SELECT INTO
426
10.1.3 BULK行集提供程序
428
10.1.4 按最小方式记录日志的操作
430
10.1.5 INSERT EXEC
447
10.1.6 序列机制
450
10.1.7 全局唯一标识符(GUID)
454
10.2 删除数据
454
10.2.1 TRUNCATE与DELETE
454
10.2.2 删除包含重复数据的行
455
10.2.3 基于联接的DELETE
456
10.3 更新数据
458
10.3.1 基于联接的UPDATE
458
10.3.2 更新大值数据类型
461
10.3.3 用SELECT和UPDATE语句进行赋值
462
10.4 合并数据
465
10.4.1 MERGE语句基础
467
10.4.2 额外增加一个谓词
470
10.4.3 多个WHEN子句
471
10.4.4 WHEN NOT MATCHED BY SOURCE子句
472
10.4.5 MERGE Values
473
10.4.6 MERGE与触发器
474
10.5 OUTPUT子句
475
10.5.1 带有OUTPUT的INSERT
476
10.5.2 带有OUTPUT的DELETE
477
10.5.3 带有OUTPUT的UPDATE
478
10.5.4 带有OUTPUT的MERGE
480
10.5.5 可组合的DML
481
10.6 总结
482
第11章 查询分区表
483
11.1 在SQL Server中进行分区
483
11.1.1 分区视图
483
11.1.2 分区表
484
11.2 总结
496
第12章 图、树、层次结构和递归查询
497
12.1 术语
497
12.1.1 图
497
12.1.2 树
498
12.1.3 层次结构
498
12.2 应用场景
498
12.2.1 员工组织图
498
12.2.2 材料清单(BOM)
500
12.2.3 道路系统
502
12.3 迭代/递归
505
12.3.1 下属
505
12.3.2 祖先
513
12.3.3 带有路径枚举的子图/子树
516
12.3.4 排序
518
12.3.5 环
520
12.4 具体化路径
523
12.4.1 维护数据
523
12.4.2 查询
527
12.5 使用HIERARCHYID数据类型的具体化路径
531
12.5.1 维护数据
532
12.5.2 查询
537
12.5.3 使用HIERARCHYID的其他方面
540
12.6 嵌套集合
548
12.6.1 分配左值和右值
549
12.6.2 查询
553
12.7 传递闭包(Transitive Closure)
555
12.7.1 有向无环图
555
12.7.2 无向有环图
559
12.8 总结
566
索引
567
编辑推荐
精通T-SQL高级查询和性能优化的幕后机制,编写更快,更具伸缩性的代码。作者团队用精深而富有洞察力的T-SQL知识帮助开发人员解决最棘手的基于集合的查询和性能优化问题,加深开发人员对T-SQL体系结构和内部处理细节的理解。通过各种实用方法和高级技术提高代码质量。 你将学到: 从面向过程的编程到基于集合的语言及思维逻辑的转变;使用自顶向下的方法论优化查询;根据算法复杂度预测性能;比较各种数据聚合技术,包括新的分组集;管理数据操作(插入、删除、更新和合并),提高性能;针对分区表编写更有效的查询;处理图、树和层次结构,以及递归查询;通过纯逻辑难题来磨练解决问题的能力。
作者简介
本书全面深入地介绍了Microsoft SQL Server 2008中高级T-SQL查询、性能优化等方面的内容,以及SQL Server 2008新增加的一些特性。主要内容包括SQL的基础理论、查询优化、查询算法及复杂度,以及在使用子查询、表表达式、排名函数、数据聚合和透视转换、TOP和APPLY、数据修改、分区表、特殊数据结构等实际应用时会遇到的各种高级查询问题和解决方案。
作为一本讲述T-SQL高级查询的专业图书,本书旨在结合实践中的各种常见问题,教读者如何用SQL作为语言工具来思考问题,揭示基于集合查询的强大威力。本书内容丰富、文字简洁明快,列举的实例具有一定的难度,而且实用性很强,可以把它们作为解决实际问题的标准模式。阅读本书,可以充分地理解T-SQL语言和良好的编程实践,学会如何编写更加有效而强大的查询语句。
本书适合有经验的程序员和DBA阅读,是在SQL Server 2008中编写和优化SQL查询的必备参考图书。
图书封面
Microsoft SQL Server 2008技术内幕:T-SQL查询下载 精选章节试读 更多精彩书评