【问题标题】:Is it ok to set the sequence of a table to very large value like 10 million?可以将表的序列设置为非常大的值,例如 1000 万吗?
【发布时间】:2010-09-18 08:25:37
【问题描述】:

是否存在任何性能影响或任何类型的问题? 我这样做的原因是我们正在使用相似表的两组数据库之间进行一些同步,并且我们希望在同步数据时避免重复的 PK 错误。

【问题讨论】:

    标签: database performance oracle


    【解决方案1】:

    是的,没关系。

    注意:如果您有性能问题,可以使用“CREATE SEQUENCE”上的“CACHE”选项:

    "指定数据库预分配多少序列值并保存在内存中以便更快地访问。这个整数值可以有 28 位或更少的数字。这个参数的最小值是 2。对于循环的序列,这个value 必须小于循环中的值的数量。您不能缓存超过给定序列号循环中的值。因此,CACHE 允许的最大值必须小于由以下公式确定的值:"

    (CEIL (MAXVALUE - MINVALUE)) / ABS (INCREMENT)
    

    “如果发生系统故障,所有未在提交的 DML 语句中使用的缓存序列值都将丢失。丢失值的潜在数量等于 CACHE 参数的值。”

    【讨论】:

      【解决方案2】:

      当然。您计划做的实际上是一种相当普遍的做法。只需确保您用于保存 ID 的客户端代码中的变量足够大(即,使用长整数而不是整数)

      【讨论】:

        【解决方案3】:

        我们最近在创建具有非常大种子的表时遇到的唯一问题是当我们尝试与我们无法控制的系统进行交互时。该系统显然将我们的 ID 读取为 char(6) 字段,因此当我们发送第 10000000 行时,它将无法写入。

        在性能方面,我们没有发现使用大 ID 号码存在问题。

        【讨论】:

          【解决方案4】:

          我们没有看到任何性能影响。我经常大量增加序列。如果您需要将数据“回填”到表格中,这些空白会派上用场。

          我们唯一遇到的问题是当一个非常大的序列在特定客户端程序上超过 MAXINT 时。序列很好,但是在客户端应用程序中转换为整数开始失败!在我们的例子中,很容易重构表中的 ID 列并再次运行,但回想起来,如果表的排列方式不同,这可能是一个混乱的情况!

          【讨论】:

            【解决方案5】:

            如果您要同步两个表,为什么不更改 PK 种子/增量数量,以便在添加新 PK 时一切都自行处理?

            假设您必须同步来自 10 个不同数据库中的 10 个患者表的数据。
            假设最终所有数据库都必须同步到总部的 Patient 表中。

            将每行的 PK 增加 10,但确保每个数据库的最后一位数字不同。

            DB0 10,20,30..
            DB1 11,21,31..
            .....
            DB9 19,29,39..

            当所有内容合并时,保证没有冲突。

            这很容易扩展到 n 个数据库表。只要确保您的 PK 密钥类型不会溢出。我认为 BigInt 对你来说已经足够大了......

            【讨论】:

              猜你喜欢
              • 2010-11-21
              • 2020-09-20
              • 2021-05-18
              • 1970-01-01
              • 2018-12-17
              • 1970-01-01
              • 2018-03-28
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多