第7章 被动式索引设计 练习
7.1 你将如何归类图7.12中的尖刺:有优化空间的问题制造者,无优化空间的问题制造者,还是受害者?
分析: 如图7.2所示,我们首先要区分的是问题的制造者及受害者。长服务时间为问题制造者,长排队时间为受害者。如果一个事务独占了资源(也许是因为使用了不合适的索引),那么就会对其他事务造成明显的负面影响,进而导致这些事务也与独占资源的事务一同出现在异常报告中。 那么问题来了,哪些时间是服务时间?哪些时间是排队时间?答案在图5.1中给出。
从图5.1看到,本地响应时间由服务时间和排队时间组成。其中服务时间包括:CPU时间和磁盘服务时间。磁盘服务时间又包括同步读、同步写和异步读(非重叠的部分)。而排队时间包括CPU排队、磁盘排队、锁等待和其他等待。那什么是同步读、同步写和异步读呢?如图2.9所示。
术语同步I/O是指在进行I/O操作时,DBMS不能继续进行其他操作,它必须等待,直至I/O操作完成。例如,在一次同步读操作中,我们必须先定位到我们所需的行(在图中用“C”表示起始部分的CPU时间),随后访问该页并处理该页(在图中展示为第二部分的CPU时间),每一步都必须等待,直至上一步完成。 而另一方面,异步读是当前一步的页尚在处理时就被提前发起了,这一处理时间和I/O时间之间可能有很大一部分重叠。理想情况下,在这些页被实际处理之前,异步I/O就已经完成了。每一组页都以这种方式被预读然后再处理,图2.9展示了这一过程。注意,整个预读过程从一次同步读开始,然后才开始预读过程,以此来最小化首次读取的等待时间。 明确了以上这些概念,再来看图7.12的尖刺,服务时间为1秒(CPU时间+同步读),排队时间为7秒(等待预读、锁等待、其他等待)。从问题的制造者及受害者的定义看,首先属于受害者。 除了是受害者,该尖刺会不会也是问题制造者呢?感觉上210次调用花费1秒时间,平均每次1000/210=4.8ms,应该是有优化空间的。先看定义。 有优化空间的问题制造者是指那些通过改进索引来获得大幅性能提升的事务,它有两个特征: 1. 磁盘服务时间长。 2. 磁盘读大多是对表页的读取。 再看图7.12的尖刺,平均每次调用1000/210=4.8ms,每两次调用就有一次随机I/O,而且大部分是表访问,符合有优化空间的问题制造者特征。如果该尖刺是只读事务,则通过使用宽索引可以避免全部表页的读取。由此,若7.12中的程序是只读的,则其调优的潜在空间为1秒。包含插入、更新或删除操作的程序的调优潜在空间较小,因为无论索引多宽,表页都必须被更新。 综上所述,本题答案为,既是有优化空间的问题制造者,又是受害者。
7.2 如何减少本地响应时间? 有了对上一题的分析,这道题自然而然就有答案了: 1. 作为受害者,找出等待的资源,优化相应的问题制造者。 2. 作为有优化空间的问题制造者,建立宽索引优化查询。