代码之家  ›  专栏  ›  技术社区  ›  FerranB Tom

你为什么讨厌Oracle上的序列?[关闭]

  •  4
  • FerranB Tom  · 技术社区  · 17 年前

    有些人不喜欢Oracle上的序列。为什么?我认为它们非常易于使用,而且非常漂亮。您可以在选择、插入、更新等操作中使用它们,。..

    8 回复  |  直到 10 年前
        1
  •  5
  •   Jon Ericson Homunculus Reticulli    17 年前

    我不喜欢。我应该指出,有时候人们讨厌他们不理解的东西。

    序列对于生成唯一ID非常重要。从概念上讲,有一种不依赖于表内容的生成ID的方法是有用的。您不需要锁定表来生成唯一的数字。

    序列对于跨多个需要唯一的表生成键也很有用。例如,如果我有一个新项目进入系统,我想一次在多个表中放入一行,我可以从序列中获取一个ID,并在插入任何数量的表时重用它。如果处理得当,我知道ID不会与表中已有的值冲突,并且每一行都有相同的ID。

    我假设这些事情在自动递增列中也是可能的。

        2
  •  5
  •   Robert Gould    17 年前

    总之,我喜欢序列,但我更喜欢列的自动递增关键字。

        3
  •  5
  •   SquareCog    17 年前

    因为我曾多次被DBA攻击,他们迁移数据库、移动所有对象和数据,并错误地重新创建序列,从0重新启动它。欢乐随之而来。..

    序列也可以在RAC上抛出一个循环,除非您指定希望它们严格递增,否则您将从中获得唯一的数字,但不一定是严格递增的顺序(发生这种情况是因为为了避免每个sequence.nextval调用的节点间通信,每个节点都会获得即将到来的数字的一小部分)。对各种“select max(sequence_id)”查询造成严重破坏。

    哦,autoincrement关键字很好,但这只是语法糖——其他两个问题都是相当严重的“陷阱”。

        4
  •  2
  •   cletus    17 年前

    在深入了解JPA之前,我过去更喜欢自动增量列(如MySQL、SQL Server等)。在这一点上,自动递增字段的弱点对我来说变得显而易见:在获得ID之前必须插入。这是维护对象之间关系的一个问题。

    在JPA中,当您使用Oracle时 entityManger.persist(object) 它选择下一个序列值并将其分配为ID,而自动递增列则在提交后才会发生。差别很大。

    不过,它们有点难,我想这就是为什么人们不喜欢它们(或者他们没有看到与自动递增字段相比的优势)。

    序列的另一个问题是它们只是松散有序的,很多人想要绝对有序。我认为这是最大的缺点(无论如何我都能看到)。

        5
  •  0
  •   Jonathan Leffler    17 年前

    因为它们比IBM Informix Dynamic Server中的SERIAL列更难使用。

        6
  •  0
  •   Mark Harrison    17 年前

    一些同事不喜欢它们,因为很难记住设置普通自动递增字段的样板。

    幸运的是,SQL Developer会为您填写样板,所以现在问题还不算太严重。

        7
  •  0
  •   Nick Pierpoint    17 年前

    我不讨厌序列。序列太棒了。爱他们!

    它们在分布式环境中是安全的;它们可用于在需要时模拟自动递增字段(带触发器),同时还允许您提前获得ID——当您准备将数据集加载到多个表中并且希望在插入之前获得ID时,这很好。

    我接受乔纳森·莱夫勒对他自己的回答的评论,但对我来说,控制的平衡——一个单独的序列——给了你一个相对容易模仿自动增量字段的ID生成。

        8
  •  0
  •   Alan    17 年前

    序列的一个问题是,如果你有多个worker写入同一个表,所有worker都从同一个序列中获取密钥,结果是索引块周围会发生争用,worker很可能正在写入同一块(这意味着他们必须等待)。

    一种解决方案是使用反向键索引。

    另一种选择是创建一个由以下内容组成的密钥 :worker_number || nanoTime()|| random_number()

    (极有可能提供唯一数字的东西。(例如,地球被小行星撞击的可能性比得到一个重复的数字更大)

    推荐文章