【问题标题】:Understanding spanner explanation了解扳手解释
【发布时间】:2020-02-18 01:19:10
【问题描述】:

我在 Google Cloud Spanner 中有一个包含 8.6 亿行的表格,我正在尝试了解解释的工作原理。

该表有一个字符串列geoid,并且该列有一个索引。

当我运行以下查询时,它只需要 36 毫秒:

SELECT count(*)
FROM usbg_2015
WHERE geoid= '340170175001'

表结构为:

CREATE TABLE usbg_2015 (
    geoid STRING(12),
    quadkey STRING(24),
) PRIMARY KEY (geoid, quadkey)

但是,我不明白为什么解释说它使用 Table Scan 而不是 Index Scan。我将 表扫描 理解为对表的完整扫描,在这种情况下读取 860M 行,它应该花费超过 36 毫秒的时间。我错过了什么?

【问题讨论】:

  • 仅供参考,全表扫描在解释中明确指出:“表扫描:mytable (full scan: true)”

标签: google-cloud-spanner


【解决方案1】:

在解释中,Table Scan仅仅意味着它从一个表中读取数据,并不一定意味着全表扫描。索引扫描也是如此。这意味着它正在从索引中读取。在这两种情况下,如果存在可搜索的谓词(例如,主键或索引列上的常量前缀),它们就会进行搜索。

该计划使用基表,并搜索并扫描了 11 行,否则您将看到表扫描返回 860M 行。

geoid 是 usbg_2015 表的前导主键列吗?考虑到计划,这是我能想到的唯一解释。

【讨论】:

  • 是的,这是有道理的。我已编辑问题以包含表定义。它使用组合主键。
【解决方案2】:

table scan 有两种含义:

1- 当您按主键(或在您的情况下是第一部分)搜索时

2- 当您执行索引扫描并在选择列表中有一个既不在索引也不在存储子句中的列时,您必须将索引与表本身连接起来。此操作称为表扫描。

【讨论】:

    猜你喜欢
    • 2010-11-12
    • 2012-09-12
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多