暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle序列与GUID

askTom 2018-11-07
392

问题描述

我们正在为公司开发一个新系统。NET和Oracle数据库12cR2使用RAC。它基本上执行以下操作: 接收XML格式的发票,然后根据业务规则对其进行验证。

一个要求是在表示层中给客户端一个 “跟踪号”,以便稍后客户端可以向应用程序询问发票的状态。

有一个六列表,称为 “跟踪”。开发团队希望使用代码生成的GUID (varchar2 32字节) 作为跟踪号。对于每个请求,客户将获得一个跟踪号。该表与另一个名为 “MESSAGES_TABLE” (有四列) 的表相关 (FK),该表存储客户端在系统验证发票时获得的消息 (可能是 “acepted”,或者根据验证而产生大量消息)。每个跟踪号可以在 “MESSAGES_TABLE” 中具有一个或多个行,并且存在用于查看与其消息相关联的跟踪号的状态的查询 (pk在两个表之间的连接)。

注意: 该系统每年将获得300毫米。

问题是: 会更好:

1.使用GUID作为pk和跟踪号?
2.使用自动生成的序列作为pk和跟踪号?
3.使用自动生成的序列作为pk,使用GUID作为跟踪号?
4.还有什么?

所有这些问题都与拥有最佳性能有关。我知道用索引组织GUID列对性能不利,数据库更好地处理序列号。但是我也知道,往返于数据库以获取序列可能是不好的 (也许高缓存值会有所帮助)。

我需要一些建议。

谢谢。

问候,


专家解答

序列比GUIDs快并不简单。汤姆写了几篇讨论这方面的文章:

https://asktom.oracle.com/pls/apex/asktom.search?tag=sequences-or-guids
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2570145300346198113
https://asktom.oracle.com/pls/apex/asktom.search?tag=guids-sequential-or-random

最终,如果您关心这一点,请对数据进行测试和验证以查看影响。

请记住: 性能只是一个考虑因素。Guid几乎肯定会使用更多的存储空间。但它们也是全球独一无二的。如果你在别处复制数据,这可能会很有用。

But I also know that taking a roundtrip to the database to get a sequence could be bad

往返是不必要的!使用insert的返回子句,您可以获得插入的值。所以你可以把seq.nextval粘在values子句中,并得到它的值。

而且,因为你在12c上,你也可以使用一个标识列:

create table t (
  c1 int generated as identity
);

var id number;

insert into t values ( default )
returning c1 into :id;

print :id;

        ID
----------
         1

insert into t values ( default )
returning c1 into :id;

print :id;

        ID
----------
         2
复制

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论