首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle DB序列并行处理-多线程

Oracle DB序列并行处理-多线程
EN

Stack Overflow用户
提问于 2022-09-21 22:49:12
回答 1查看 51关注 0票数 0

创建新对象时,我需要生成一个唯一的编号来将其附加到对象的元数据中。对象元数据只需要使用框架库从代码中设置,因为对象在内部链接到数据库中的多个表,直接更新列是不建议的,也是有风险的。为此,我尝试使用Oracle DB序列,并使用nextval作为唯一的引用号。但是为了使这个序列生成更加并行,我想引入10个序列,增量为10,从1,2,3..,10开始,这样就不会产生重复的数字。这个想法是,当一次创建10000个对象时,我可以将负载分成10个不同的序列,并在10个批中并行处理。

但是,当我实现这个解决方案时,我可以观察到,单序列实现比分成10个不同的序列更有效。

观察结果是这样的。

案例1:

从单个序列器中生成10个序列需要(来自同一序列的10个序列号)- ~400 ms。

从10个不同的测序器中产生10个序列需要(每个测序器1个)- ~40 ms。

案例2:

从单个序列器中生成1000个序列需要(来自同一个序列器的1000个序列号)- ~4600 ms

从10个不同的测序器中生成1000个序列需要(每个测序器100个数字)- ~4200 ms。

因此,单序列虽然出现了十倍的速度,但随着并行请求的增加,它的性能更好,而多序列实现则线性地扩展了100倍,并且在1000个序列世代中几乎与单个序列同步。

这里所有排序器的缓存大小是相同的,并设置为100。

我想了解,多个排序器的实现是否可以像我想的那样在并行处理中有所帮助?如果没有,请解释原因?如果可以的话,我在哪里做错了呢?

)谢谢您在这方面的时间:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-21 23:28:14

你的解决方案似乎没有必要复杂。只需增加一个序列的缓存大小,就可以在一个突发中保存尽可能多的值。

查询多个序列将给数据库内核带来更多的开销,因为每个序列及其缓存必须加载和维护在内存中,每个查询必须单独解析和运行,而对单独对象的独立查询将占用更多的库缓存。与编译一个查询并使用经过适当优化的缓存执行它更多次相比,成本要高得多。最后,它将导致资源争用,而不是规模,我不建议走这条路。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73807671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档