问题描述
我们正在为公司开发一个新系统。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列对性能不利,数据库更好地处理序列号。但是我也知道,往返于数据库以获取序列可能是不好的 (也许高缓存值会有所帮助)。
我需要一些建议。
谢谢。
问候,
一个要求是在表示层中给客户端一个 “跟踪号”,以便稍后客户端可以向应用程序询问发票的状态。
有一个六列表,称为 “跟踪”。开发团队希望使用代码生成的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上,你也可以使用一个标识列:
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
597次阅读
2025-04-15 17:24:06
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
576次阅读
2025-04-18 14:18:38
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
491次阅读
2025-04-08 09:12:48
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
474次阅读
2025-04-20 10:07:02
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
459次阅读
2025-04-22 00:20:37
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
434次阅读
2025-04-22 00:13:51
Oracle 19c RAC更换IP实战,运维必看!
szrsu
434次阅读
2025-04-08 23:57:08
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
419次阅读
2025-04-17 17:02:24
火焰图--分析复杂SQL执行计划的利器
听见风的声音
367次阅读
2025-04-17 09:30:30
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
358次阅读
2025-04-15 14:48:05