创建新对象时,我需要生成一个唯一的编号来将其附加到对象的元数据中。对象元数据只需要使用框架库从代码中设置,因为对象在内部链接到数据库中的多个表,直接更新列是不建议的,也是有风险的。为此,我尝试使用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。
我想了解,多个排序器的实现是否可以像我想的那样在并行处理中有所帮助?如果没有,请解释原因?如果可以的话,我在哪里做错了呢?
)谢谢您在这方面的时间:)
发布于 2022-09-21 23:28:14
你的解决方案似乎没有必要复杂。只需增加一个序列的缓存大小,就可以在一个突发中保存尽可能多的值。
查询多个序列将给数据库内核带来更多的开销,因为每个序列及其缓存必须加载和维护在内存中,每个查询必须单独解析和运行,而对单独对象的独立查询将占用更多的库缓存。与编译一个查询并使用经过适当优化的缓存执行它更多次相比,成本要高得多。最后,它将导致资源争用,而不是规模,我不建议走这条路。
https://stackoverflow.com/questions/73807671
复制相似问题