如何使用 Xquery 为 MarkLogic 实现自动递增数字主键
How to implment auto increment numberic primary key for MarkLogic with Xquery
如何在 MarkLogic 中实现 Auto-Increment-Primary-Key RMDB 功能?
如果该密钥存储为配置 XML 文件 中的一个元素并使用 XQuery 库的“单例”模式生成它,则会产生任何副作用。 (多个 difffernet Xquery 代码将使用相同的库来生成唯一密钥。)我猜它不适用于 ML 集群?它可能只适用于单个节点 ML。那会是多线程 Corbs 例程的瓶颈吗?
递增数字键通常被认为是一种反模式,因为它需要锁定和共享状态,这可能成为性能瓶颈。它会起作用,但它只会限制您的性能和吞吐量。
你真的应该考虑你是需要 连续的 数值,还是只需要唯一的数值。
您可以利用 xdmp:random()
生成一个随机的 64 位数值。它只是不会是连续的。
或者,对于非数字唯一值,sem:uuid-string()
如果您真的非常需要自动递增的数字,那么您将需要一个文档来跟踪该数字,然后获取序列中的下一个值将涉及读取该文档并更新它的值(这将获取独占写锁)。您可以变得更精细,让分片负责数字范围,以尝试获得一些额外的吞吐量和并行 activity,但代价是插入时间不是 100% 顺序的。您可以从 Twitter Snowflake 中汲取灵感:https://github.com/twitter-archive/snowflake/tree/snowflake-2010
如何在 MarkLogic 中实现 Auto-Increment-Primary-Key RMDB 功能?
如果该密钥存储为配置 XML 文件 中的一个元素并使用 XQuery 库的“单例”模式生成它,则会产生任何副作用。 (多个 difffernet Xquery 代码将使用相同的库来生成唯一密钥。)我猜它不适用于 ML 集群?它可能只适用于单个节点 ML。那会是多线程 Corbs 例程的瓶颈吗?
递增数字键通常被认为是一种反模式,因为它需要锁定和共享状态,这可能成为性能瓶颈。它会起作用,但它只会限制您的性能和吞吐量。
你真的应该考虑你是需要 连续的 数值,还是只需要唯一的数值。
您可以利用 xdmp:random()
生成一个随机的 64 位数值。它只是不会是连续的。
或者,对于非数字唯一值,sem:uuid-string()
如果您真的非常需要自动递增的数字,那么您将需要一个文档来跟踪该数字,然后获取序列中的下一个值将涉及读取该文档并更新它的值(这将获取独占写锁)。您可以变得更精细,让分片负责数字范围,以尝试获得一些额外的吞吐量和并行 activity,但代价是插入时间不是 100% 顺序的。您可以从 Twitter Snowflake 中汲取灵感:https://github.com/twitter-archive/snowflake/tree/snowflake-2010