非唯一索引

在有些应用程序中,大多数表更新可以限制在一个时段内进行。 您可以设置系统,让所有的更新在夜间或者指定日期进行。 此外,以批处理方式执行更新时,您就可以在更新时删除所有非唯一索引,然后建立新索引。 此策略可以改善性能。

删除非唯一索引可具有以下积极影响:
  • 由于要更新的索引更少,所以更新程序会运行得更快。 通常,删除索引,在无索引的情况下进行更新,然后重新建立索引,所花费的总时间比在有索引的情况下进行更新要短。 (有关更新索引的时间成本的讨论,请参阅索引的时间开销。)
  • 新建的索引效率更高。频繁的更新会弱化索引结构,使索引中包含很多部分完整的叶子页。 这种弱化会降低索引的有效性并浪费磁盘空间。

为了节约时间,应确保批处理更新程序按照主键索引定义的顺序请求行。 该顺序使得按顺序读取主键索引的各页,而且每页只读取一次。

使用 LOAD 语句或 dbload 实用程序时,使用索引还将降低表的植入速度。装入一个没有索引的表是一个很快的过程(和盘对盘顺序复制速度一样),但是更新索引会增加很大的开销。

要避免此开销,可以:

  1. 删除该表(如果存在)。
  2. 不指定任何唯一约束而创建表。
  3. 将所有行均装入表中。
  4. 更改该表,使之符合唯一约束。
  5. 创建非唯一索引。

如果无法保证装入的数据能够符合所有唯一约束,就必须在装入行之前建立唯一索引。 如果这些行是以至少一种索引正确排序的,就能够节约时间。 如果可以选择,使之成为包含最大键的行。 此策略可以使必须读取和写入的叶子页的数量最少。