gpt4 book ai didi

google-cloud-platform - Cloud Spanner 在不应该使用二级索引的情况下使用了二级索引

转载 作者:行者123 更新时间:2023-12-02 20:09:15 27 4
gpt4 key购买 nike

使用主键快速执行的现有查询会在没有通知的情况下大幅减慢(10 毫秒 -> 8 秒),因为现在会自动使用为另一个用例创建的二级索引。

Cloud-Spanner-Web-Query 的“解释”告诉我使用了二级索引。如果我更改顺序(仅用于测试目的)或提供 FORCE_INDEX,查询会再次快速。

我可以使用 Cloud Spanner Query Syntax Documentation 中记录的 FORCE_INDEX=_BASE_TABLE 来“修复”此问题。 .

我的问题是:我真的必须对每个查询都执行此操作以避免此类影响吗?

这将查询定义与索引定义混合在一起,恕我直言,这不是一件好事。

带有主索引的表:

CREATE TABLE change_history (
userId INT64 NOT NULL,
createdAtUnique INT64 NOT NULL,
itemId STRING(512) NOT NULL,
newValue FLOAT64 NOT NULL,
oldValue FLOAT64 NOT NULL,
) PRIMARY KEY (userId, itemId, createdAtUnique DESC)

二级索引:

CREATE INDEX ch_userid_createdatunique_all ON change_history (
userId,
createdAtUnique
) STORING (
newValue,
oldValue
)

原始查询:

SELECT * FROM change_history WHERE                         
userId = 2563
AND itemId = "215414"
AND createdAtUnique >= 15385766670000000
AND createdAtUnique <= 15465254670000000 ORDER BY createdAtUnique

我希望查询继续使用它设计的主键。

但是通过添加辅助索引,查询开始使用这个索引而不是主键。

最佳答案

在这种情况下,查询优化器决定选择索引,因为 1) 它正在覆盖,2) 避免了原始计划中的排序,因为索引包含按升序排序的 createdAtUnique,这是查询中请求的排序顺序。然而,对于您的数据分布来说,这并不是一个糟糕的选择。

一般来说,对于手动调整以获得您知道最佳/良好的特定计划的查询,最好使用 force_indexjoin_type查询中的提示可防止优化器可能选择不同计划的罕见情况。

关于google-cloud-platform - Cloud Spanner 在不应该使用二级索引的情况下使用了二级索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54025228/

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