PCI IN 集群索引慢

PCI IN slow with cluster index

我们正在使用 ASE SYBASE 15.7

我们有一个巨大的历史 table:7 亿条记录和一个 CLUSTER INDEX:c1,c2,c3,c4 和 ALLOW_DUP_ROWS

每个月我们通过 BCP IN 加载 700,000 条记录 table 这些记录有很多重复记录,因为字段:c2 和 c3 对所有记录具有相同的值 BCP IN时间为6小时

我们更改了每月 table 中 INSERT 的逻辑,现在 CLUSTER INDEX 的所有字段:c1、c2、c3、c4 都是不同的。

本次修改后,BCP IN流程耗时2小时!

为什么现在时间少了?我们不清楚原因

非常感谢!

我猜你的 table 的锁定方案是 allpages

如果 allpages table 上的聚簇索引允许重复 keys/rows,则重复 key/row 条目将保留在所谓的溢出页中(而来自较旧的手册,这个 info on overflow pages 仍然准确)。

每次在table中插入一个dupkey/row,从头到尾扫描整个溢出页链,然后在链的末尾添加新条目.

正如您所想象的,随着这条链变得越来越长,每次连续插入发生所需的时间也越来越长。

如果您有数据加载的历史记录,我猜您会发现随着时间的推移,随着(重复)行的数量增加,加载时间也会增加……这本来是归因于table扫描不断增加的溢出页面链所需的更多时间。

通过生成新数据 'unique',您可能已经消除了扫描溢出页面链的大部分开销。我说 'likely' 是因为从你的 post 中不清楚某些新数据是否包含 table 中已经存在的键值(即,键在给定批次中可能是唯一的要插入的数据,但键在 table).

中不一定是唯一的

我通常建议客户 不要allpages 锁定的 table 上放置非唯一聚集索引,这仅仅是因为溢出页链的开销处理中。


很有可能,如果您消除了非唯一聚集索引,那么您可能会看到您的数据加载 运行 甚至更快,例如:

  • 将table转换为数据行锁定;可比较的 CLUSTERED w/dup 行不使用昂贵的溢出页链(尽管新数据将不再按索引键的物理顺序维护)
  • drop/replace聚簇索引与非聚簇索引;非聚集索引不使用代价高昂的溢出页链