【问题标题】:BIGINT conversion exercise Sybase ASE 15 7BIGINT 转换练习 Sybase ASE 15 7
【发布时间】:2015-09-07 11:49:23
【问题描述】:

目前我们正在使用 Sybase ALTER 命令将生产数据库表从 INT 转换为 BIGINT。 其中一张表有 15 亿行,我们无法在一个周末的时间范围内转换(运行了近 43 小时,然后我们将其杀死并恢复了数据库转储)。

将此表快速转换为 BIGINT 的任何其他建议。此表上有聚集索引、唯一索引和非聚集索引。

我正在考虑以下解决方案:您能建议最好的方法吗?

  1. 创建一个新列并使用旧值更新它,然后删除旧列,然后重命名新列。
  2. BCP 输出数据,截断表,使用新数据类型更改表结构,然后 BCP 输入数据
  3. 将表分区为小表,然后更改表并再次合并。

【问题讨论】:

  • 我的选择是:BCP 输出数据,截断表,使用新数据类型更改表结构,然后在数据中进行 BCP,加载应该比更新 15 亿行快得多,你需要做的就是改变表格的结构。
  • 有人可以确认 ASE 中的加载速度比更新快吗,我在考虑 IQ,现在我看到他正在使用 ASE,ASE 中的 DML 与 IQ 相比相当快,所以也许我错了?
  • 谢谢,但我在那个表上有索引(1 个集群和 3 个非集群),所以如果我选择 BCP,我们需要重建索引 - 这又需要大量时间。

标签: sybase bigint


【解决方案1】:

我不知道这是否会有所帮助,但您可以考虑一下。 如果您可以 bcp out 并对数据进行排序,bcp'ing 回到新表中,那么您可以创建带有 SORTED_DATA 的聚集索引。这样可以节省大量聚集索引的时间。使用 unix 排序可以更快地进行排序(您可以 bcp 到管道,然后从管道直接返回到 bcp-in。)

如果您有一个带有多个引擎的数据库服务器,那么您可以同时重新创建非聚集索引。这将节省时间(如果之前的重新创建是有序的,您希望它会是大约三分之一的时间。)

否则可能会进行分区 - 您可以同时 bcp 到不同的分区并在不同的分区上建立索引(但我们没有这样做,抱歉,我对此没有有用的建议。)

【讨论】:

    【解决方案2】:

    在短时间内改变。

       创建没有索引和触发器的新表。 将数据从“源表”加载到“目标表”。 使用后缀创建索引。

       在时间窗口中: 插入和更新自初始加载以来已更改的记录。 将“源表”重命名为“备份源表”。 将新表重命名为源表的名称。 在新表中创建触发器。 新表的“重命名索引”。 验证这两个表是否具有相同的信息。 准备好了。

    【讨论】:

      猜你喜欢
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      相关资源
      最近更新 更多