【问题标题】:GCP Spanner: Secondary Index doesn't work in Update and Delete statementsGCP Spanner:二级索引在更新和删除语句中不起作用
【发布时间】:2019-07-23 09:20:43
【问题描述】:

二级索引在扳手的更新和删除语句中不起作用。因此有时简单的更新和删除语句会花费大量时间

我试过这个: "更新 table1@{FORCE_INDEX=i_index1} 设置 column1='abc' where column2='xyz'"

如果这不起作用,那么快速更新和删除语句的替代方法是什么

【问题讨论】:

    标签: google-cloud-platform google-cloud-spanner


    【解决方案1】:

    大多数情况下,Cloud Spanner 会自动选择可以使查询最高效的索引,而无需指定任何索引。在某些情况下,索引可以选择会使查询变慢的索引;这可以解释为什么您的语句运行了很长时间。

    通过查看二级索引可以troubleshoot slow queries。如果您确实发现某个索引会降低您的查询速度,那么您可以specify another index

    就您的 Cloud Spanner 而言,secondary indexes are used for common queries,所以只有 SELECT 语句,以加快它们的速度;表示 UPDATE 和 DELETE 语句将不包含二级索引。

    由于您只能在 SELECT 语句中使用二级索引,我建议您尝试以下操作: 更新表1 SET column1 = 'abc' WHERE 列 X 在 (选择列 X FROM table1@{FORCE_INDEX = i_index1} WHERE column2 = 'xyz')

    您基本上检索列值并将它们设置为您要匹配的 WHERE 条件值,使用二级索引作为中介。如果要匹配多列,可能需要稍微更改语句。

    【讨论】:

    • 感谢您分享详细信息。我尝试了您提到的方法,但更新仍然很慢(尽管使用二级索引选择更好)。 PDATE table1 SET column1 = 'abc' WHERE primarykeycolumn IN (SELECT primarykeycolumn FROM table1@{FORCE_INDEX = i_index1} WHERE column2 = 'xyz') 我也在控制台上的 partitioned-dml 中尝试过,但也没有运气。 gcloud spanner databases execute-sql abc --instance=xyz --enable-partitioned-dml --sql='update ******' 任何其他建议!
    • 我已经尝试过我向您建议的语句并且它工作正常,但是正如您提到的那样很慢。出于好奇,我还尝试了您提供的原始语句,但它不起作用,这是因为二级索引不能直接用于 UPDATE 或 DELETE 语句中。但是,Cloud Spanner 运行语句需要很长时间似乎是正常的。您唯一能做的就是等待语句完成,或者重组您的数据库,使其尽可能高效地运行语句。使用分区 DML 已经是一个好的开始。
    • 您可以查找Cloud Spanner Best Practices,其中包括有关批量加载最佳实践、DML 最佳实践、架构设计最佳实践和 SQL 最佳实践的文章,将帮助您优化数据库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多