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聚簇索引与非聚簇索引;非聚集索引不使用代价高昂的溢出页链
我们正在使用 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聚簇索引与非聚簇索引;非聚集索引不使用代价高昂的溢出页链