gpt4 book ai didi

google-cloud-spanner - 二级索引在创建时是否锁定任何内容?

转载 作者:行者123 更新时间:2023-12-04 09:37:31 26 4
gpt4 key购买 nike

给定以下表架构:

CREATE TABLE Record (
-- uuidv4
recordId STRING(36) NOT NULL,
-- uuidv4
userId STRING(36),
isActive BOOL
lastUpdate TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true)
...
) PRIMARY KEY (recordId)

CREATE NULL_FILTERED INDEX RecordByUser
ON Record (userId, isActive)
对于创建的每条记录,我们都会创建一条记录(在索引中),以便能够通过用户 ID 获取用户的所有记录。根据可能需要的内容,可能会有额外的 STORING带有附加信息列的子句。
我的理解是,当我向 Record 添加记录时表,Spanner 将触发对索引的写入。由于索引是非交错的,因此数据本身可能与原始记录具有不同的位置。
在该假设下,写入二级索引的操作是否会锁定 Record表直到它完成还是不影响另一个?
我猜它们是完全独立的,因为可以在事后创建索引,并且 Spanner 将触发不影响 Record 的操作状态的回填操作。 table 。
编写索引的行为必须从节点中获取一些资源,所以我认为这确实是限制。在 Record 的高写场景下表,我们还将有效地为索引表调用第二次写入 RecordByUser消耗更多的节点写入吞吐量容量。
因此,添加到二级索引的行为不需要对源表进行任何锁定(在本例中为 Record)。主要关注的是写入吞吐量和这些写入的任何热点。例如,如果我们将时间戳记作为索引的第一部分进行索引,则对索引的写入会成堆。我这里的理解正确吗?
在现有表上创建索引的过程中,回填过程是否持有索引的排他锁,例如 Postgres:
https://www.postgresql.org/docs/current/index-locking.html
或者,在回填发生的同时,在二级索引创建期间新的写入是否可以进入索引?
我可以想象 Spanner 端的回填过程,它需要读取快照并开始写入。鉴于 Spanners 花哨的时钟,如果它在索引中遇到比它尝试写入的行新的行,它只会将旧行放在地板上并继续。

最佳答案

谢谢你的提问。谷歌工程师在这里寻求帮助。
+1 至 chainicko@一般锁定机制的答案。尽管回填仍在运行,但您仍然可以读/写原始表,因此它不是“锁定”的。
回填期间不允许读取/查询索引本身。但允许写入原始表。新的写入同时添加到索引中。回填后,Spanner 将确保在查询时仅显示最新数据。
至于“以时间戳作为索引的第一部分进行索引”的例子,因为它在索引上创建了一个热点,所以它仍然会对整个系统产生负面影响,即使它没有锁定原表。

关于google-cloud-spanner - 二级索引在创建时是否锁定任何内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62501756/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com