分析混合表的查询配置文件¶
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));
示例中还使用了另一个类似的混合表 sensor_data_device2
。
访问主键列的查询计划¶
当查询筛选表的主键时(timestamp
),会自动建立索引,查询配置文件使用的是 TableScan 运算符。另请注意此查询使用的是 ROW_BASED 扫描模式。
SELECT * FROM sensor_data_device1 WHERE timestamp='2024-03-01 13:45:56.000';

访问二级索引的查询计划¶
生成此配置文件的查询如下所示:
SELECT COUNT(*) FROM sensor_data_device1 WHERE device_id='DEVICE2';
这里只展示了部分配置文件,重点介绍了 IndexScan 运算符及其属性。扫描模式为 ROW_BASED,您可以将鼠标悬停在 UI:Access Predicates
上来查看完整的谓词。此外,还显示完全限定索引名称。

混合表的 DML 查询计划¶
混合表上的 DML 操作通常会修改单行。例如:
UPDATE sensor_data_device2 SET device_id='DEVICE3' WHERE timestamp = '2024-04-02 00:00:05.000';
TableScan 运算符的查询配置文件显示 UPDATE 访问了混合表的行存储(扫描模式为 ROW_BASED):

利用缓存数据提高效率的重复查询¶
这种情况下,假设以下查询在混合表上快速连续运行两次。
SELECT device_id, AVG(temperature)
FROM sensor_data_device2
WHERE temperature>33
GROUP BY device_id;
第一个查询从对象存储中读取了所有数据。查询的第二次运行从列式缓存中读取了 100% 的数据。另请注意,此查询的扫描模式是 COLUMN_BASED。

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