全表扫描全主键扫描

图片

上面的操作算子,为什么是table full scan,而不是 TABLE RANGE SCAN 呢?

3 个赞

@论坛小助手, 解答一下

1 个赞

根据您提供的信息,您的 SQL 语句是 explain select * from t1 order by c1;,并且执行计划显示为 TABLE FULL SCAN。下面是关于为什么在这个场景下使用了全表扫描而不是范围扫描的详细解释。

为什么是 TABLE FULL SCAN 而不是 TABLE RANGE SCAN

1. 排序操作的影响

  • 在您的查询中,您使用了 ORDER BY c1 子句。这要求数据库按照 c1 列的值对结果进行排序。
  • 即使 c1 是主键,数据库仍然需要读取所有的行并进行排序。在这种情况下,直接进行全表扫描可能是更高效的选择,因为可以一次性读取所有数据并进行排序,而不是通过索引进行范围扫描后再进行排序。

2. 优化器的选择

  • 数据库优化器会根据成本模型选择最优的执行计划。在某些情况下,全表扫描的成本可能比范围扫描加排序更低。
  • 例如,如果表的数据量不大,或者表的数据已经按 c1 排序存储(如 B-Tree 索引),那么全表扫描后进行排序可能会更高效。

3. 执行计划细节

  • 您的执行计划显示:
    | 1D OPERATOR [NAME | EST. ROWS | EST. TIME (us) |
    JO |TABLE FULL SCAN|t1 比 13 1
    outputs & filters
    0 - output([t1.ci], [ti.c2], [tt.c3], [t1.c4]}, Filter(nil), rowser=16
    access([ti.c1], [t1.c2], [tt.c3], [t1.c4]), partitions (po)
    is_index_back=false, is_global 园 id
    range_key([ti.cl]), range(MIN } MAX)always ‘true
    
  • 这里 range_key([ti.cl]), range(MIN ; MAX) always true 表示范围是从最小值到最大值,即全表扫描。

总结

  • 在这种情况下,由于 ORDER BY 操作的存在,数据库选择了 TABLE FULL SCAN 来确保所有数据都被读取并进行排序。
  • 如果您希望避免全表扫描,可以考虑使用覆盖索引(Covering Index),即索引包含了查询所需的所有列,这样可以减少回表操作,提高查询性能。

如果您有更多具体的性能调优需求或问题,请提供更多上下文信息,以便进一步分析和建议。

更多信息请查看:

  1. SQL 规范
  2. Runtime Filter
  3. 基于规则的路径选择
  4. FULL JOIN
  5. 表扫描方式规范
  6. 分区概述
  7. 全文查询
2 个赞

在OB里,全表扫描,也是按照主键值的大小,从小读到大 ? @论坛小助手

3 个赞

在 OceanBase 中,全表扫描(TABLE FULL SCAN)并不一定按照主键值的大小顺序从小到大读取数据。全表扫描通常会扫描整个表的所有行,而不考虑主键的顺序。具体来说:

  1. 全表扫描的特点

    • 全表扫描是按物理存储顺序读取表中的所有数据。
    • 在 OceanBase 中,数据是按照聚集索引(通常是主键)的顺序存储的,但全表扫描不一定会利用这一点。
    • 全表扫描的目的是读取表中的所有数据,而不是根据某个特定的顺序。
  2. 主键顺序与全表扫描的关系

    • 虽然数据是按照主键顺序存储的,但在全表扫描过程中,OceanBase 不会特意按主键顺序进行扫描。
    • 全表扫描的主要目标是高效地读取所有的数据行,而不是按某种顺序。
  3. 排序操作的影响

    • 如果您需要对结果进行排序,可以在 ORDER BY 子句中指定排序列。例如,您的查询 SELECT * FROM t1 ORDER BY c1; 会先进行全表扫描,然后再对结果进行排序。
    • 排序操作是在全表扫描之后进行的,这意味着即使数据是按主键顺序存储的,全表扫描本身不会保证结果是有序的。

总结起来,在 OceanBase 中,全表扫描并不保证按照主键值的大小从小到大读取数据。如果您需要按主键顺序获取数据,可以使用 ORDER BY 子句来确保结果是有序的。

如果您的查询确实需要按主键顺序读取数据,并且性能是一个重要考虑因素,建议使用覆盖索引或优化查询以减少不必要的全表扫描。希望这能解答您的疑问。

检索到的文档如下:

  1. 表存储
  2. 单表查询
  3. 概述
  4. 分页查询
  5. 表扫描方式规范
  6. 基于规则的路径选择
  7. OceanBase 数据库性能的影响因素
3 个赞

在OB里,全表扫描和全主键全部扫描,有什么区别 ? 在执行全主键全部扫描时,操作算子是什么 ? @论坛小助手

2 个赞

在 OceanBase 中,全表扫描(TABLE FULL SCAN)和全主键扫描(FULL PRIMARY KEY SCAN)是两种不同的操作,它们在执行方式和性能上有一些区别。下面详细解释这两种扫描的区别以及全主键扫描时的操作算子。

全表扫描(TABLE FULL SCAN)

  1. 定义

    • 全表扫描是指读取表中的所有数据行,不考虑任何索引。
    • 通常用于没有合适的索引可以利用的情况,或者查询条件无法通过索引高效完成时。
  2. 特点

    • 扫描整个表的所有行。
    • 不考虑数据的存储顺序。
    • 通常用于小表或需要读取大量数据的情况。
  3. 操作算子

    • 在 OceanBase 的执行计划中,全表扫描通常显示为 TABLE FULL SCAN

全主键扫描(FULL PRIMARY KEY SCAN)

  1. 定义

    • 全主键扫描是指通过主键索引来读取表中的所有数据行。
    • 主键索引通常是聚集索引,因此这种扫描方式会按主键顺序读取数据。
  2. 特点

    • 通过主键索引进行扫描,数据是按主键顺序存储的。
    • 适用于需要按主键顺序获取数据的情况。
    • 通常比全表扫描更高效,因为索引可以提供更快的访问路径。
  3. 操作算子

    • 在 OceanBase 的执行计划中,全主键扫描通常显示为 INDEX RANGE SCANINDEX FAST FULL SCAN,具体取决于优化器的选择。

区别

  • 扫描方式

    • 全表扫描:直接读取表中的所有数据行,不使用索引。
    • 全主键扫描:通过主键索引读取表中的所有数据行,数据是按主键顺序存储的。
  • 性能

    • 全表扫描:在数据量较大的情况下,可能会导致性能下降。
    • 全主键扫描:通常比全表扫描更高效,尤其是在数据量较大时。
  • 适用场景

    • 全表扫描:适用于小表或需要读取大量数据的情况。
    • 全主键扫描:适用于需要按主键顺序获取数据的情况。

示例

假设我们有一个表 t1,其结构如下:

CREATE TABLE t1 (
    c1 INT PRIMARY KEY,
    c2 INT,
    c3 INT
);

全表扫描

EXPLAIN SELECT * FROM t1;

执行计划可能显示为:

|ID|OPERATOR        |NAME|EST. ROWS|COST|
-----------------------------------------
|0 |TABLE FULL SCAN |t1  |100      |100 |

全主键扫描

EXPLAIN SELECT * FROM t1 ORDER BY c1;

执行计划可能显示为:

|ID|OPERATOR        |NAME|EST. ROWS|COST|
-----------------------------------------
|0 |INDEX RANGE SCAN|t1  |100      |50  |

总结

  • 全表扫描全主键扫描 是两种不同的扫描方式,全表扫描不使用索引,而全主键扫描通过主键索引进行扫描。
  • 全表扫描 操作算子通常为 TABLE FULL SCAN
  • 全主键扫描 操作算子通常为 INDEX RANGE SCANINDEX FAST FULL SCAN

希望这能解答您的疑问。如果您有更多问题,请随时提问。

检索到的文档如下:

  1. 表扫描方式规范
  2. 阅读和管理 OceanBase 数据库 SQL 执行计划
  3. 主键表和无主键表
  4. SUBPLAN FILTER
  5. 设置并行执行并行度
  6. UNION
  7. OceanBase 数据库性能的影响因素
  8. MERGE
  9. 并行执行简介
2 个赞

本来就是查所有数据

1 个赞

优化器的选择。 可以加上hint,对比一下。hint参考:https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005686951#5-title-INDEX%20Hint

1 个赞

学习

1 个赞

select * 肯定是要回表,而且没有where条件