新書推薦:
《
孤独传:一种现代情感的历史
》
售價:NT$
390.0
《
家、金钱和孩子
》
售價:NT$
295.0
《
形而上学与测量
》
售價:NT$
340.0
《
世界航母、舰载机图鉴 【日】坂本明
》
售價:NT$
340.0
《
量价关系——透视股票涨跌脉络
》
售價:NT$
340.0
《
创伤与记忆:身体体验疗法如何重塑创伤记忆 [美]彼得·莱文
》
售價:NT$
295.0
《
复原力
》
售價:NT$
345.0
《
近代中国思维方式的演变(王中江著作系列)
》
售價:NT$
950.0
編輯推薦:
? 中国数据库界几大势力云集于这本旷世奇作,没读过咋好意思和DBA同行打招呼
? 蚂蚁(原支付宝)数据库团队资深专家携成长回忆与技术历程倾情献上最优质翻译
? 本书旨在——通过设计适用于现代硬件的索引,来提升关系型数据库的性能
? 软硬件发展让数据库性能被忽视,但数据处理量增长更快,全新索引优化设计才能根治随机读速缓慢
內容簡介:
本书提供了一种简单、高效、通用的关系型数据库索引设计方法。作者通过系统的讲解及大量的案例清晰地阐释了关系型数据库的访问路径选择原理,以及表和索引的扫描方式,详尽地讲解了如何快速地估算SQL运行的CPU时间及执行时间,帮助读者从原理上理解SQL、表及索引结构、访问方式等对关系型数据库造成的影响,并能够运用量化的方法进行判断和优化,指导关系型数据库的索引设计。
關於作者:
Tapio Lahdenmaki,数据库性能顾问,教授通用索引设计课程。他在IBM公司工作了三十多年,是公司全球课程中有关DB2 for zOS性能相关课程的主要作者。Michael Leach,关系型数据库顾问,已从IBM公司退休,他拥有二十年的应用系统及数据库课程的教授经验。两位作者的文章均被翻译成了多国语言广为传播。他们有关索引设计的方法被成功应用于许多核心系统。
目錄 :
第1章 概述1
关于SQL性能的另一本书1
不合适的索引3
误区和误解4
误区1:索引层级不要超过5层5
误区2:单表的索引数不要超过6个6
误区3:不应该索引不稳定的列6
示例7
磁盘驱动器使用率7
系统化的索引设计8
第2章 表和索引结构10
介绍10
索引页和表页11
索引行11
索引结构12
表行12
缓冲池和磁盘IO12
从DBMS缓冲池进行的读取13
从磁盘驱动器进行的随机IO13
从磁盘服务器缓存进行的读取14
从磁盘驱动器进行的顺序读取15
辅助式随机读15
辅助式顺序读18
同步IO和异步IO18
硬件特性19
DBMS特性20
页20
表聚簇21
索引行21
表行22
索引组织表22
页邻接23
B树索引的替代品24
聚簇的许多含义25
第3章 SQL处理过程27
简介27
谓词27
评注28
优化器及访问路径28
索引片及匹配列29
索引过滤及过滤列29
访问路径术语31
监控优化器32
帮助优化器(统计信息)32
帮助优化器(FETCH调用的次数)32
何时确定访问路径33
过滤因子34
组合谓词的过滤因子35
过滤因子对索引设计的影响37
物化结果集39
游标回顾39
方式1:一次FETCH调用物化一条记录40
方式2:提前物化41
数据库设计人员必须牢记41
练习41
第4章 为SELETE语句创建理想的索引43
简介43
磁盘及CPU时间的基础假设44
不合适的索引44
三星索引——查询语句的理想索引45
星级是如何给定的46
范围谓词和三星索引48
为查询语句设计最佳索引的算法49
候选A50
候选B50
现今排序速度很快——为什么我们还需要候选B51
需要为所有查询语句都设计理想索引吗52
完全多余的索引52
近乎多余的索引53
可能多余的索引53
新增一个索引的代价54
响应时间54
磁盘负载55
磁盘空间56
一些建议57
练习58
第5章 前瞻性的索引设计59
发现不合适的索引59
基本问题法(BQ)59
注意60
快速上限估算法(QUBE)61
服务时间62
排队时间62
基本概念:访问63
计算访问次数65
FETCH处理66
主要访问路径的QUBE示例67
使用满足需求的成本最低的索引还是所能达到的最优索引:示例172
该事务的基本问题73
对该事务上限的快速估算73
使用满足需求的成本最低的索引还是所能达到的最优索引74
该事务的最佳索引75
半宽索引(最大化索引过滤)75
宽索引(只需访问索引)76
使用满足需求的成本最低的索引还是所能达到的最优索引:示例277
范围事务的BQ及QUBE78
该事务的最佳索引79
半宽索引(最大化索引过滤)80
宽索引(只需访问索引)81
何时使用QUBE82
第6章 影响索引设计过程的因素83
IO时间估算的验证83
多个窄索引片84
简单就是美(和安全)86
困难谓词87
LIKE谓词87
OR操作符和布尔谓词88
IN谓词89
过滤因子隐患90
过滤因子隐患的例子92
最佳索引95
半宽索引(最大化索引过滤)96
宽索引(只需访问索引)97
总结97
练习99
第7章 被动式索引设计100
简介100
EXPLAIN描述了所选择的访问路径101
全表扫描或全索引扫描101
对结果集排序101
成本估算102
数据库管理系统特定的EXPLAIN选项及限制102
监视揭示现实103
性能监视器的演进104
LRT级别的异常监视106
程序粒度的均值是不够的106
异常报告举例:每个尖刺一行106
问题制造者和受害者108
有优化空间的问题制造者和无优化空间的问题制造者108
有优化空间的问题制造者109
调优的潜在空间111
无优化空间的问题制造者114
受害者115
查找慢的SQL调用117
调用级别的异常监视118
Oracle举例121
SQL Server举例123
结论125
数据库管理系统特定的监视问题126
尖刺报告127
练习127
第8章 为表连接设计索引129
简介129
两个简单的表连接131
例8.1:CUST表作为外层表131
例8.2:INVOICE表作为外层表132
表访问顺序对索引设计的影响133
案例研究133
现有索引136
理想索引142
理想索引,每事务物化一屏结果集146
理想索引,每事务物化一屏结果集且遇到FF缺陷149
基本连接的问题(BJQ)151
结论:嵌套循环连接153
预测表的访问顺序153
合并扫描连接和哈希连接155
合并扫描连接155
例8.3:合并扫描连接155
哈希连接157
程序C:由优化器选择MSHJ(在现有索引条件下)158
理想索引159
嵌套循环连接VS. MSHJ及理想索引161
嵌套循环连接VS. MSHJ161
嵌套循环连接VS.理想索引162
连接两张以上的表163
为什么连接的性能表现较差166
模糊的索引设计166
优化器可能选择错误的表访问路径166
乐观的表设计166
为子查询设计索引167
为UNION语句设计索引167
对于表设计的思考167
冗余数据167
无意识的表设计171
练习173
第9章 星型连接175
介绍175
维度表的索引设计177
表访问顺序的影响178
事实表的索引179
汇总表182
第10章 多索引访问184
简介184
索引与184
与查询表一同使用索引与186
多索引访问和事实数据表187
用位图索引进行多索引访问187
索引或188
索引连接189
练习190
第11章 索引和索引重组191
B树索引的物理结构191
DBMS如何查找索引行192
插入一行时会发生什么193
叶子页的分裂严重吗194
什么时候应该对索引进行重组196
插入模式196
索引列的稳定性205
长索引行207
举例:对顺序敏感的批处理任务208
表乱序(存在聚簇索引)211
表乱序(没有以CNO开头的聚簇索引)212
存储在叶子页中的表行212
SQL Server212
Oracle213
索引重组的代价214
分裂的监控215
总结216
第12章 数据库管理系统相关的索引限制219
简介219
索引列的数量219
索引列的总长度220
变长列220
单表索引数量上限220
索引大小上限220
索引锁定221
索引行压缩221
数据库管理系统索引创建举例222
第13章 数据库索引选项224
简介224
索引行压缩224
索引键以外的其他索引列225
唯一约束227
从不同的方向扫描数据库索引227
索引键截断228
基于函数的索引228
索引跳跃式扫描229
块索引230
数据分区的二级索引230
练习231
第14章 优化器不是完美的232
简介232
优化器并不总能看见最佳方案234
匹配及过滤问题234
非BT谓词234
无法避免的排序237
不必要的表访问238
优化器的成本估算可能错得离谱239
使用绑定变量的范围谓词239
偏斜分布241
相关列242
部分索引键的警示故事243
成本估算公式246
估算IO时间247
估算CPU时间248
协助优化器处理估算相关的问题249
优化器的问题是否会影响索引设计252
练习253
第15章 其他评估事项254
QUBE公式背后的假设条件254
内存中的非叶子索引页255
例子255
磁盘服务器读缓存的影响256
缓冲子池258
长记录259
慢速顺序读259
实际的响应时间可能比QUBE评估值短得多259
叶子页和表页缓存在缓冲池中260
识别低成本的随机访问262
辅助式随机读取262
辅助式顺序读265
评估CPU时间(CQUBE)265
单次顺序访问的CPU时间265
单次随机访问的CPU时间267
单次FETCH调用的CPU时间269
每排序一行的平均CPU时间270
CPU评估举例270
宽索引还是理想索引270
嵌套循环(及反范式化)还是MSHJ271
合并扫描与哈希连接的比较274
跳跃式顺序扫描275
CPU时间仍然不可忽视276
第16章 组织索引设计过程277
简介277
计算机辅助式索引设计278
设计出色索引的9个步骤280
参考文献282
术语表283
索引291
內容試閱 :
前言
关系型数据库至今已存在了三十多年。在其发展早期,由于硬件资源限制及优化器成熟度的不足,性能问题非常普遍,因此性能成为了人们优先考虑的事项。但现在情况已经不同了,硬件及软件以超出人们想象的速度发展了起来,系统已经能够自己关心自己的性能了,这在之前看来是不可思议的!但比这些资源增长速度更快的是随之产生的大量信息以及这些信息所衍生出的活动。另外,有一个重要的硬件还没有跟上整体的发展速度:虽然磁盘已变得更大且异常廉价,但它们的访问速度仍相对较慢。因此,许多老问题其实并没有消失——它们只是变换了形式。这其中的有些问题可能会造成巨大的影响——那些所谓的应该只需运行不到一秒的“简单”查询实际却运行了几分钟或更久,尽管所有的书中都写了如何正确编写查询、如何组织表,以及应当按照什么规则来决定将哪些列添加至索引上。所以,很明显,我们需要有一本能够突破常规的书,真正开始思考为何现今仍有这么多人还会遇到如此多的问题。
为了满足这一需求,我们认为必须关注两个问题。第一个必须关注的对象是关系型系统中用于确定如何以最高效的方式查询所需数据的部分(我们称其为SQL 优化器)。第二个必须关注的是索引及表是以何种方式被扫描的。我们试着把自己放在优化器的角度思考问题,也许当我们理解为什么可能存在问题时,我们就能够做出改变。幸运的是,我们需要知道的有关优化器的内容其实非常少,但非常重要。本书与其他同领域的书籍的一个很重要的区别在于,我们不会提供大量的用于指导SQL 编写以及表和索引设计的规则和语法。这不是一本告诉你在各种场景下应当使用哪一个SQL WHERE语句的书,也不是一本告诉你应当使用什么语法的书。如果我们努力遵循一大堆复杂、模糊甚至可能不完整的指导原则,那么我们就是在走前人走过的老路。相反,如果我们能够理解SQL 请求对关系型系统造成的潜在影响,并知道如何控制这一影响,那么我们就能够理解、控制、最小化甚至避免这些问题。
本书的第二个目的是展示如何使用这些知识从CPU 和执行时间的角度量化运行过程。只有这样,我们才能真正判断我们设计的表和索引是否合适,我们需要用真实的数字来展示优化器是如何思考的、扫描将耗费多少时间,以及需要进行哪些改动以提供满意的性能。不过,最重要的是,我们必须能够方便且快速地完成这一评估过程,这就要求我们必须将关注点放在少数几个真正重要的问题上,而不是将关注点放在那些不那么重要的细节上(许多人都被这些细节问题困扰过)。所以,关键就是要关注少数核心领域,并能够说出这需要花费多少时间或成本。
同样是由于我们专注于核心问题,所以我们还能提供另一个优势。对于那些可能使用多个关系型产品(即便来自相同的供应商)的人,由于我们在本书中所使用的是一种适用于所有关系型产品的通用方法,所以使用者就不需要阅读和掌握多套截然不同的规则和建议。所有“真正的”关系型系统的优化器都有一个相同的任务:它们都必须要扫描索引和表。它们都使用异常相似的方式来处理这些操作(虽然他们对其有各自不同的描述方式)。当然,它们之间的确存在着一些差异,但是我们可以毫不费力地处理这些不同。
也正是由于相同的原因,本书的读者对象包括:认为了解SQL 性能方面的知识或如何有效设计索引的知识能给自己带来益处的人,直接负责索引设计的人,编写SQL 语句用于查询或作为应用程序一部分的人,以及那些负责维护关系型数据和关系型环境的人。只要你觉得需要对自己所做的事情的性能影响负责,那么你都将不同程度地从本书中受益。
最后,用一句话概括本书目标读者所需具备的背景知识:我们假定读者已经具备了SQL 这一关系型语言相关的知识。考虑阅读本书的人应该已经具备了对计算机系统的大体理解。除此以外,能帮到读者的最重要的品质也许就是对事物运行原理的好奇和兴趣了,还有想把事情做得更好的渴望。另一方面,在众多拥有几十年的关系型系统经验的人中,有两类人也会从本书受益:第一类是那些根据详细的规则手册良好地管理了系统很多年的人,他们想通过理解这些规则适用的原因来使自己的工作更轻松一些;第二类是那些已经使用了本书中所描述的技术很多年,但对于新硬件所带来的改善并不赞赏的人。
本书中的绝大部分观点及使用的技术都是原创的,因此很少有对外部出版物及其他作者成果的引用。在本书的创作过程中,我们非常感谢给予了我们如此多帮助和鼓励的朋友及同事们。感谢Matti Sthl 在全书撰写过程中所给予的详细指点及批判性但极其有用的建议。感谢Lennart Henng、Ari Hovi、Marja Krmeniemi 和Timo
Raitalaakso 的帮助和校对,也感谢Akira Shibamiya在关系型性能公式上的原创工作。另外,还要感谢许许多多的学生和数据库顾问们,感谢他们提供的对于实际问题及其解决方案的深入见解。最后,特别感谢Meta 和Lyn,没有他们的鼓励与支持,本书不可能完成,Meta 还特别为本书设计了封面,与全书的主旨非常契合。
Tapio Lahdenmki(斯姆勒尼科,斯洛文尼亚)
Michael Leach(什鲁斯伯里,英格兰)