Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

比较排序方式

本部分比较为不同类型的查询使用单列排序键、复合排序键和交错排序键时的性能差异。

在本示例中,您将使用 CUSTOMER 和 LINEORDER 表中的数据创建一个名为 CUST_SALES 的非规范化的表。CUSTOMER 和 LINEORDER 是教程:优化表设计中使用的 SSB 数据集的一部分。

新的 CUST_SALES 表拥有 4.80 亿行数据,按 Amazon Redshift 标准来说,这不算大,但它足以显示出性能上的差异。更大的表更容易展示较大的差异,特别是对交错排序来说。

要比较三种排序方法,请执行以下步骤:

  1. 创建 SSB 数据集。

  2. 创建 CUST_SALES_DATE 表。

  3. 创建三个表以比较排序方式。

  4. 执行查询并比较结果。

创建 SSB 数据集

如果您尚未执行该步骤,请遵循“优化表设计”教程中步骤 1:创建测试数据集中的步骤在 SSB 数据集中创建这些表并为它们加载数据。加载数据需要花费约 10 到 15 分钟时间。

“优化表设计”教程中的示例使用了四节点群集。本示例中的比较使用了两节点群集。您的结果会因不同的群集配置而有所差异。

创建 CUST_SALES_DATE 表

CUST_SALES_DATE 表是包含客户和收入相关数据的非规范化表。要创建 CUST_SALES_DATE 表,请执行以下语句。

Copy
create table cust_sales_date as (select c_custkey, c_nation, c_region, c_mktsegment, d_date::date, lo_revenue from customer, lineorder, dwdate where lo_custkey = c_custkey and lo_orderdate = dwdate.d_datekey and lo_revenue > 0);

下面的查询显示了 CUST_SALES 的行数。

Copy
select count(*) from cust_sales_date; count ----------- 480027069 (1 row)

执行下面的查询以查看 CUST_SALES 表的第一行。

Copy
select * from cust_sales_date limit 1; c_custkey | c_nation | c_region | c_mktsegment | d_date | lo_revenue ----------+----------+----------+--------------+------------+----------- 1 | MOROCCO | AFRICA | BUILDING | 1994-10-28 | 1924330

创建表以比较排序方式

要比较排序方式,需要创建三个表。第一个表使用单列排序键;第二个使用复合排序键;第三个使用交错排序键。单列排序将使用 c_custkey 列。复合排序和交错排序将使用 c_custkeyc_nationc_region 列。

要创建表以进行比较,请执行以下 CREATE TABLE 语句。

Copy
create table cust_sales_date_single sortkey (c_custkey) as select * from cust_sales_date; create table cust_sales_date_compound compound sortkey (c_custkey, c_region, c_mktsegment, d_date) as select * from cust_sales_date; create table cust_sales_date_interleaved interleaved sortkey (c_custkey, c_region, c_mktsegment, d_date) as select * from cust_sales_date;

执行查询并比较结果

对各个表执行相同的查询以比较每个表的执行时间。为消除编译时间导致的差异,我们将运行每个查询两次,并记录第二次的运行时间。

  1. 测试限制 c_custkey 列(每个表中排序键中的第一列)的查询。执行以下查询。

    Copy
    -- Query 1 select max(lo_revenue), min(lo_revenue) from cust_sales_date_single where c_custkey < 100000; select max(lo_revenue), min(lo_revenue) from cust_sales_date_compound where c_custkey < 100000; select max(lo_revenue), min(lo_revenue) from cust_sales_date_interleaved where c_custkey < 100000;
  2. 测试限制 c_region 列(复合键和交错键的排序键中的第二列)的查询。执行以下查询。

    Copy
    -- Query 2 select max(lo_revenue), min(lo_revenue) from cust_sales_date_single where c_region = 'ASIA' and c_mktsegment = 'FURNITURE'; select max(lo_revenue), min(lo_revenue) from cust_sales_date_compound where c_region = 'ASIA' and c_mktsegment = 'FURNITURE'; select max(lo_revenue), min(lo_revenue) from cust_sales_date_interleaved where c_region = 'ASIA' and c_mktsegment = 'FURNITURE';
  3. 测试限制 c_region 列和 c_mktsegment 列的查询。执行以下查询。

    Copy
    -- Query 3 select max(lo_revenue), min(lo_revenue) from cust_sales_date_single where d_date between '01/01/1996' and '01/14/1996' and c_mktsegment = 'FURNITURE' and c_region = 'ASIA'; select max(lo_revenue), min(lo_revenue) from cust_sales_date_compound where d_date between '01/01/1996' and '01/14/1996' and c_mktsegment = 'FURNITURE' and c_region = 'ASIA'; select max(lo_revenue), min(lo_revenue) from cust_sales_date_interleaved where d_date between '01/01/1996' and '01/14/1996' and c_mktsegment = 'FURNITURE' and c_region = 'ASIA';
  4. 评估结果。

    下表汇总了三种排序类型的性能。

    重要

    下述结果显示了用于这些示例的两节点群集的相对性能。受节点类型、节点数量、争用资源的其他并发操作等多种因素的影响,您的结果会有所不同。

    排序方式 查询 1 查询 2 查询 3
    单列排序 0.25 s 18.37 s 30.04 s
    复合排序 0.27 s 18.24 s 30.14 s
    交错排序 0.94 s 1.46 s 0.80 s

    在查询 1 中,所有三种排序方式的结果非常相似,因为 WHERE 子句只限制第一列。访问交错表时有少量的开销。

    在查询 2 中,单列排序键没有任何优势,因为 WHERE 子句中未使用该列。复合排序键没有任何性能提高,因为该查询受到限制,只使用了排序键中的第二列和第三列。针对交错表的查询显示了最佳的性能,因为交错排序能够高效地筛选排序键中的辅助列。

    在查询 3 中,交错排序较其他方式快得多,因为它能够筛选 d_datec_mktsegmentc_region 列的组合。

根据 Amazon Redshift 标准,本示例使用了相对较小的表,只有 4.80 亿行数据。对于较大的表(包含数十亿行以上的数据),交错排序可在某些类型的查询上获得若干数量级的性能提升。