sql - 将已排序的加载文件加载到新表中时,是否需要 CLUSTERED INDEX?

标签 sql mysql oracle informix clustered-index

INFORMIX-SE:

我的用户定期运行一个 SQL 脚本 [REORG.SQL],它将所有行按排序顺序从表中卸载到两个单独的文件(事件和非事件),删除表,重新创建表,加载排序的加载文件进入其中,在我对卸载文件进行排序的同一列上创建一个集群索引,创建其他支持索引并更新其统计信息。

(参见 REORG.SQL 脚本:SE: 'bcheck -y' anomaly)

(另请参阅:customer.pk_name joining transactions.fk_name vs. customer.pk_id [serial] joining transactions.fk_id [integer],了解集群索引按名称而不是 pk_id[serial]=fk_id[int] 的原因)

在我的 REORG.SQL 脚本中,我一直遇到索引文件一致性问题,所以我怀疑 CLUSTER INDEX 与它有关,并创建了没有集群的索引,问题就消失了!

现在我的问题是:如果我设法加载我所有的交易数据,按客户全名排序到一个新创建的表中,我是否真的有必要创建一个 CLUSTER INDEX,而实际上行已经排序了聚类完成的顺序相同吗?..我知道聚簇索引在添加新行时开始失去其聚类,那么创建聚簇索引的优势是什么?..查询优化器是否利用聚类与当行基本上处于相同的聚集顺序时的非聚集索引?.. 聚集表时是否有人遇到过 IDX/DAT 文件问题?.. 也许我的 SQL 脚本有问题? (请查看我的 SQL 脚本代码,看看我是否做错了什么?)

最佳答案

脚本将事件和非事件交易卸载到两个不同的文件,每个文件按客户名称排序。然后它将它们加载回表中,首先是事件事务,然后是非事件事务。然后在客户名称上创建聚簇索引。问题是数据库现在必须返回并在构建聚簇索引时按客户名称重新排序物理行。虽然每个卸载文件都是单独按客户名排序的,但是当两者放在一起时结果不是按客户名排序,给数据库带来了更多的工作。除非其他地方需要事件交易和非事件交易的单独文件,否则您可能会尝试将所有交易转储到一个文件中,按客户名称排序,然后从该文件重新加载表。届时,表中的数据将按客户名称排序,而创建的聚簇索引不必对数据进行重新排序。

至于是否真的需要聚集索引 - 如果您使用该列进行查询,聚集索引可能很有值(value),因为它应该有助于减少获取数据所需的 I/O 数量。通常聚簇索引是在单调递增的列上创建的,因此也许 TRX_NUM 可以很好地用作要在聚簇索引上命名的列。

分享和享受。

关于sql - 将已排序的加载文件加载到新表中时,是否需要 CLUSTERED INDEX?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3413361/

相关文章:

android - SQLite:删除大量行的有效方法

mysql - SQL 仅选择列上具有最大值的行

php - 将数据从 Controller 传递到模型

mysql - 如何修复 PDO 中对未定义函数 prepare() 的调用?

MySQL:如何获取 "TICKER"列中的所有值?

mysql - SQL游戏区查询

sql - 甲骨文 |查询输出以分号分隔

sql - 如何删除 MS SQL 数据库中最旧的一周(期间)?

mysql - 如何设计数据库来处理哪些用户观看了哪些视频?

css - 在 Application Express 中设置元素格式和布局的好方法是什么?