在 Fabric 数据仓库中使用数据聚类分析

适用于:SQL 分析终结点和 Microsoft Fabric 中的数据仓库

Fabric 数据仓库中的数据聚类分析可组织数据,以提高查询性能和减少计算使用量。 本教程逐步讲解如何使用数据聚类分析创建表,从创建聚集表到检查其有效性。

先决条件

  • 具有有效订阅的 Microsoft Fabric 租户帐户。
  • 确保你具有已启用 Microsoft Fabric 的工作区:创建工作区
  • 请确保已创建仓库。 若要创建新仓库,请参阅 在 Microsoft Fabric 中创建仓库
  • 基本了解 T-SQL 和查询数据。

导入示例数据

本教程使用 NY 出租车示例数据集。 将 NY 出租车数据导入仓库。 使用 “将示例数据加载到数据仓库”教程 教程。

创建带有数据聚类的表

对于本教程,我们需要 NYTaxi 表的两个副本:从教程导入的表的常规副本,以及使用数据聚类分析的副本。 使用以下命令根据原始 NYTaxi 表使用 CREATE TABLE AS SELECT (CTAS) 创建新表:

CREATE TABLE nyctlc_With_DataClustering 
WITH (CLUSTER BY (lpepPickupDatetime)) 
AS SELECT * FROM nyctlc

注释

本示例假定“加载示例数据到数据仓库”教程中向 NY 出租车数据集提供的表名称。 如果您为表使用了不同的名称,请调整命令,将 nyctlc 替换为您的表名称。

此命令会创建原始 NYTaxi 表的确切副本,但在 lpepPickupDatetime 列上进行数据聚类。 接下来,我们将使用此列进行查询。

查询数据

对 NYTaxi 表运行查询,并在NYTaxi_With_DataClustering表上重复相同的查询以进行比较。

注释

对于该分析,最好查看两次运行在冷缓存状态下的性能,即不使用 Fabric 数据仓库的缓存功能。 因此,在查看 Query Insights 中的结果之前,请完全运行每个查询一次。

我们使用在仓库中经常重复的查询语句。 此查询计算2008-12-312014-06-30之间每年的平均票价金额:

SELECT
    YEAR(lpepPickupDatetime), 
    AVG(fareAmount) as [Average Fare]
FROM 
    NYTaxi
WHERE 
    lpepPickupDatetime BETWEEN '2008-12-31' AND '2014-06-30'
GROUP BY 
    YEAR(lpepPickupDatetime)
ORDER BY 
    YEAR(lpepPickupDatetime) DESC
OPTION (LABEL = 'Regular');

注释

在将此查询中使用的标签选项与以后通过Query Insights 视图使用数据集群分析的表的Regular查询详细信息进行比较时,此标签选项非常有用。

接下来,我们将重复相同的查询,但在使用数据聚类分析的表版本上:

SELECT 
    YEAR(lpepPickupDatetime), 
    AVG(fareAmount) as [Average Fare]
FROM 
    NYTaxi_With_DataClustering
WHERE 
    lpepPickupDatetime BETWEEN '2008-12-31' AND '2014-06-30'
GROUP BY 
    YEAR(lpepPickupDatetime)
ORDER BY 
    YEAR(lpepPickupDatetime) DESC
OPTION (LABEL = 'Clustered');

第二个查询使用标签 Clustered 来允许我们稍后使用 Query Insights 标识此查询。

检查数据聚类分析的有效性

设置群集后,可以使用 Query Insights 评估其有效性。 Fabric 数据仓库中的 Query Insights 捕获历史查询执行数据,并将其聚合为可作的见解,例如识别长时间运行的或频繁执行的查询。

在这种情况下,我们使用 Query Insights 来比较在常规事例和聚集事例之间扫描的数据差异。

使用以下查询:

SELECT 
    label, 
    submit_time, 
    row_count,
    total_elapsed_time_ms, 
    allocated_cpu_time_ms, 
    result_cache_hit, 
    data_scanned_disk_mb, 
    data_scanned_memory_mb, 
    data_scanned_remote_storage_mb, 
    command 
FROM 
    queryinsights.exec_requests_history 
WHERE 
    command LIKE '%NYTaxi%' 
    AND label IN ('Regular','Clustered')
ORDER BY 
    submit_time DESC;

此查询从 exec_requests_history 视图中提取详细信息。 有关详细信息,请参阅queryinsights.exec_requests_history(Transact-SQL)。

查询按以下方式筛选结果:

  • 仅提取包含 NYTaxi 命令名称中的文本的行(如测试查询中使用的)
  • 仅提取那些标签值为常规或聚集的行

注释

查询详细信息可能需要几分钟才能在 Query Insights 中可用。 如果 Query Insights 查询未返回任何结果,请在几分钟后重试。

运行此查询时,我们观察到以下结果:

比较两个标签的查询执行指标的表:聚集和常规。常规查询使用了更多资源。

这两个查询的行计数为 6,提交时间相似。 查询 Clustered 显示 total_elapsed_time_ms 1794、 allocated_cpu_time_ms 1676 和 data_scanned_remote_storage_mb 77.519。 查询 Regular 显示 total_elapsed_time_ms 2651、 allocated_cpu_time_ms 2600 和 data_scanned_remote_storage_mb 177.700。 这些数字表明,尽管这两个查询都返回了相同的结果,但 Clustered 版本使用的 CPU 时间比 Regular 版本少约 36%,扫描的磁盘上数据量少约 56%。 在任一查询运行中均未使用缓存。 这些是有助于减少查询执行时间和资源消耗的显著结果,并使 lpepPickupDatetime 列成为数据聚类的强候选项。

注释

这是一个小表,包含大约 7600 万行和 2GB 的数据量。 尽管此查询在其聚合中只返回 6 行(一行用于该范围内的每年),但在聚合结果之前提供的日期范围内扫描大约 830 万行。 具有较大数据量的实际生产数据可以提供更显著的结果。 结果可能因查询期间的容量大小、缓存结果或并发而异。