数据库索引设计与优化作者:塔皮奥·拉赫登迈奇,迈克尔·利奇 著出版时间:2015内容简介 本书提供了一种简单、高效、通用的关系型数据库索引设计方法。作者通过系统的讲解及大量的案例清晰地阐释了关系型数据库的访问路径选择原理,以及表和索引的扫描方式,详尽地讲解了如何快速地估算SQL运行的CPU时间及执行时间,帮助读者从原理上理解SQL、表及索引结构、访问方式等对关系型数据库造成的影响,并能够运用量化的方法进行判断和优化,指导关系型数据库的索引设计。目录第1章 概述 1关于SQL性能的另一本书 1不合适的索引 3误区和误解 4误区1:索引层级不要超过5层 5误区2:单表的索引数不要超过6个 6误区3:不应该索引不稳定的列 6示例 7磁盘驱动器使用率 7系统化的索引设计 8第2章 表和索引结构 10介绍 10索引页和表页 11索引行 11索引结构 12表行 12缓冲池和磁盘I/O 12从DBMS缓冲池进行的读取 13从磁盘驱动器进行的随机I/O 13从磁盘服务器缓存进行的读取 14从磁盘驱动器进行的顺序读取 15辅助式随机读 15辅助式顺序读 18同步I/O和异步I/O 18硬件特性 19DBMS特性 20页 20表聚簇 21索引行 21表行 22索引组织表 22页邻接 23B树索引的替代品 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候选A 50候选B 50现今排序速度很快——为什么我们还需要候选B 51需要为所有查询语句都设计理想索引吗 52完全多余的索引 52近乎多余的索引 53可能多余的索引 53新增一个索引的代价 54响应时间 54磁盘负载 55磁盘空间 56一些建议 57练习 58第5章 前瞻性的索引设计 59发现不合适的索引 59基本问题法(BQ) 59注意 60快速上限估算法(QUBE) 61服务时间 62排队时间 62基本概念:访问 63计算访问次数 65FETCH处理 66主要访问路径的QUBE示例 67使用满足需求的成本最低的索引还是所能达到的最优索引:示例1 72该事务的基本问题 73对该事务上限的快速估算 73使用满足需求的成本最低的索引还是所能达到的最优索引 74该事务的最佳索引 75半宽索引(最大化索引过滤) 75宽索引(只需访问索引) 76使用满足需求的成本最低的索引还是所能达到的最优索引:示例2 77范围事务的BQ及QUBE 78该事务的最佳索引 79半宽索引(最大化索引过滤) 80宽索引(只需访问索引) 81何时使用QUBE 82第6章 影响索引设计过程的因素 83I/O时间估算的验证 83多个窄索引片 84简单就是美(和安全) 86困难谓词 87LIKE谓词 87OR操作符和布尔谓词 88IN谓词 89过滤因子隐患 90过滤因子隐患的例子 92最佳索引 95半宽索引(最大化索引过滤) 96宽索引(只需访问索引) 97总结 97练习 99第7章 被动式索引设计 100简介 100EXPLAIN描述了所选择的访问路径 101全表扫描或全索引扫描 101对结果集排序 101成本估算 102数据库管理系统特定的EXPLAIN选项及限制 102监视揭示现实 103性能监视器的演进 104LRT级别的异常监视 106程序粒度的均值是不够的 106异常报告举例:每个尖刺一行 106问题制造者和受害者 108有优化空间的问题制造者和无优化空间的问题制造者 108有优化空间的问题制造者 109调优的潜在空间 111无优化空间的问题制造者 114受害者 115查找慢的SQL调用 117调用级别的异常监视 118Oracle举例 121SQL 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:由优化器选择MS/HJ(在现有索引条件下) 158理想索引 159嵌套循环连接VS. MS/HJ及理想索引 161嵌套循环连接VS. MS/HJ 161嵌套循环连接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章 索引和索引重组 191B树索引的物理结构 191DBMS如何查找索引行 192插入一行时会发生什么 193叶子页的分裂严重吗 194什么时候应该对索引进行重组 196插入模式 196索引列的稳定性 205长索引行 207举例:对顺序敏感的批处理任务 208表乱序(存在聚簇索引) 211表乱序(没有以CNO开头的聚簇索引) 212存储在叶子页中的表行 212SQL Server 212Oracle 213索引重组的代价 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估算I/O时间 247估算CPU时间 248协助优化器处理估算相关的问题 249优化器的问题是否会影响索引设计 252练习 253第15章 其他评估事项 254QUBE公式背后的假设条件 254内存中的非叶子索引页 255例子 255磁盘服务器读缓存的影响 256缓冲子池 258长记录 259慢速顺序读 259实际的响应时间可能比QUBE评估值短得多 259叶子页和表页缓存在缓冲池中 260识别低成本的随机访问 262辅助式随机读取 262辅助式顺序读 265评估CPU时间(CQUBE) 265单次顺序访问的CPU时间 265单次随机访问的CPU时间 267单次FETCH调用的CPU时间 269每排序一行的平均CPU时间 270CPU评估举例 270宽索引还是理想索引 270嵌套循环(及反范式化)还是MS/HJ 271合并扫描与哈希连接的比较 274跳跃式顺序扫描 275CPU时间仍然不可忽视 276第16章 组织索引设计过程 277简介 277计算机辅助式索引设计 278设计出色索引的9个步骤 280参考文献 282术语表 283索引 291 上一篇: 计算机科学丛书 数据库系统实现 第二版 下一篇: 深入理解Java虚拟机:JVM高级特性与最佳实践 第三版