0

我们正在使用 ASE SYBASE 15.7

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

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

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

进行此更改后,BCP IN 过程需要 2 小时!

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

非常感谢!

4

1 回答 1

0

我猜你的表的锁定方案是allpages.

如果allpages表上的聚集索引允许复制键/行,则复制键/行条目将保存在所谓的溢出页中(而从较早的手册来看,溢出页上的此信息仍然准确)。

每次向表中插入一个 dup key/row 时,都会从头到尾扫描整个溢出页链,然后将新条目添加到链的末尾。

可以想象,随着这条链越来越长,每次连续插入都需要越来越多的时间。

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

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

我通常建议客户端不要仅仅allpages因为溢出页面链处理的开销而在锁定表上放置非唯一聚集索引。


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

  • 将表转换为数据行锁定;可比较的带有 dup 行的 CLUSTERED 不使用昂贵的溢出页面链(尽管新数据将不再按索引键按物理顺序维护)
  • 用非聚集索引删除/替换聚集索引;非聚集索引不使用代价高昂的溢出页链
于 2018-07-12T15:56:03.247 回答