分析混合表的查询配置文件

Unistore 工作负载在查询执行方面提出了一些有趣的问题,您可以使用 Snowsight Query Profile 功能或从 EXPLAIN 输出中收集的信息来进行研究。除了监控整体性能和吞吐量之外,您可能还想知道是否针对行存储或对象存储执行表扫描,或者是否使用了特定的二级索引。

本节将介绍与混合表操作有关的 Query Profile 运算符和属性,并提供了一些示例来帮助您了解如何读取访问混合表的查询计划。另请参阅 使用 Query History 监控查询活动

混合表扫描和索引扫描

表和索引扫描运算符会在查询配置文件中出现,显示对混合表的访问。这些运算符通常出现在树形结构的底部,代表读取执行特定查询所需数据的第一步。针对标准表的查询始终使用表扫描;不使用索引扫描。

当使用主键索引扫描混合表时,查询配置文件中出现 TableScan 运算符,而非 IndexScan 运算符。当使用任何其他索引(例如二级索引)扫描混合表时,您会看到 IndexScan 运算符。

IndexScan 操作符的 Attributes 属性下,您可以看到索引的完全限定名称和 Access predicates。这些是在扫描期间应用于索引的谓词。您还可以看到在表扫描期间应用的筛选器的谓词。

当谓词被“推送”到索引时,谓词在括号内包含一个占位符,用于表示查询中使用的常量。例如:SENSOR_DATA_DEVICE2.DEVICE_ID = (:SFAP_PRE_NR_1)

扫描模式

混合表数据以两种格式存储,用于满足操作和分析工作负载的需求。管理员经常问的一个问题是,给定查询访问的是行存储还是列存储(对象存储)。查询可以从一种或两种类型的存储中读取,具体取决于所涉及的表、查询的具体要求、索引的可用性和其他因素。

混合表查询的查询配置文件包括树中每个表扫描运算符 Scan Mode 的属性:

  • ROW-BASED:查询从行存储的表数据中读取,或者使用索引来计算查询结果。

  • COLUMN-BASED:查询从加载到行存储中的相同数据的对象存储副本中读取。对于 Time Travel 查询,索引扫描同样可以访问对象存储。

扫描模式针对混合表特有。如果在标准表上运行表扫描,则不显示 Scan Mode 属性。

从列式仓库缓存中读取的数据

在可能的情况下,混合表的表扫描会从列式仓库缓存中读取数据。此缓存是标准仓库缓存的扩展;请参阅 优化仓库缓存。缓存中包含已从混合表存储提供商读取的数据,并且混合表的只读查询可以访问这些数据。

要查看给定查询配置文件中的缓存使用情况,请选择表扫描运算符并检查 Statistics 下的 Percentage scanned from cache

从混合表中选择的查询无法利用 查询结果缓存

混合表请求节流

Profile Overview 中,您可以看到 Hybrid Table Requests Throttling 百分比。要查看此概述,请不要选择树中的运算符;概述适用于整个查询计划。

例如,以下查询记录显示,其执行时间的 87.5% 被混合表存储提供商节流。高节流百分比表明相对于数据库的配额,向存储提供商发送了过多的混合表读写请求。有关更多信息,请参阅 配额和节流

查询配置文件概览显示混合表请求的节流百分比较高。

示例

下列查询配置文件的 Snowsight 示例显示了混合表操作特有的属性。要理解这些示例,您不需要创建和加载所查询和修改的表。然而,以下是其中一个表的 CREATE TABLE 语句,以供参考。注意 PRIMARY KEY 约束条件(位于 timestamp 列)和二级索引(位于 device_id 列)的定义:

CREATE OR REPLACE HYBRID TABLE sensor_data_device1 (
  device_id VARCHAR(10),
  timestamp TIMESTAMP PRIMARY KEY,
  temperature DECIMAL(6,4),
  vibration DECIMAL(6,4),
  motor_rpm INT,
  INDEX device_idx(device_id));
Copy

示例中还使用了另一个类似的混合表 sensor_data_device2

访问主键列的查询计划

当查询筛选表的主键时(timestamp),会自动建立索引,查询配置文件使用的是 TableScan 运算符。另请注意此查询使用的是 ROW_BASED 扫描模式。

SELECT * FROM sensor_data_device1 WHERE timestamp='2024-03-01 13:45:56.000';
Copy
针对在主键列或时间戳上进行筛选的查询的 TableScan 运算符

访问二级索引的查询计划

生成此配置文件的查询如下所示:

SELECT COUNT(*) FROM sensor_data_device1 WHERE device_id='DEVICE2';
Copy

这里只展示了部分配置文件,重点介绍了 IndexScan 运算符及其属性。扫描模式为 ROW_BASED,您可以将鼠标悬停在 UI:Access Predicates 上来查看完整的谓词。此外,还显示完全限定索引名称。

IndexScan 运算符的属性,包括访问谓词和 ROW_BASED 扫描模式

混合表的 DML 查询计划

混合表上的 DML 操作通常会修改单行。例如:

UPDATE sensor_data_device2 SET device_id='DEVICE3' WHERE timestamp = '2024-04-02 00:00:05.000';
Copy

TableScan 运算符的查询配置文件显示 UPDATE 访问了混合表的行存储(扫描模式为 ROW_BASED):

使用 ROW_BASED 扫描单行 UPDATE 的表扫描运算符

利用缓存数据提高效率的重复查询

这种情况下,假设以下查询在混合表上快速连续运行两次。

SELECT device_id, AVG(temperature)
  FROM sensor_data_device2
  WHERE temperature>33
  GROUP BY device_id;
Copy

第一个查询从对象存储中读取了所有数据。查询的第二次运行从列式缓存中读取了 100% 的数据。另请注意,此查询的扫描模式是 COLUMN_BASED

从缓存中读取 100% 数据的表扫描运算符

联接(混合表与标准表)的查询计划

当您将混合表联接到标准表时,您会看到混合表扫描的 Scan Mode 属性,但标准表上则没有。例如,在此联接计划左侧的 TableScan 运算符使用了 ROW_BASED 扫描模式。order_header 表是混合表,以 order_id 作为其主键(此例中的联接列)。另一张表 truck_history 则是一张标准表。

联接中混合表的 TableScan 运算符,包括访问谓词和 ROW_BASED 扫描模式
语言: 中文