Redshift select * vs select 单列

Mic*_*ert 3 database-performance amazon-redshift

我有以下 Redshift 性能问题:

我有一个包含约 20 亿行的表,其中包含约 100 个 varchar 列和一个 int8 列 (intCol)。该表相对稀疏,尽管每行都有列有值。

以下查询:

select colA from tableA where intCol = ‘111111’;
Run Code Online (Sandbox Code Playgroud)

返回大约 30 行并且运行速度相对较快(约 2 分钟)

但是,查询:

select * from tableA where intCol = ‘111111’;
Run Code Online (Sandbox Code Playgroud)

需要不确定的时间(60 分钟后放弃)。

我知道修剪投影中的列通常会更好,但此应用程序需要整行。

问题:
这只是在 Redshift 中做的一件根本性的坏事吗?如果没有,为什么这个特定的查询需要这么长时间?它以某种方式与表的结构有关吗?是否有一些 Redshift 旋钮可以调整以使其更快?我还没有弄乱桌子上的 distkey 和 sortkey,但不清楚这些在这种情况下是否重要。

Mas*_*aki 5

第一个查询更快的主要原因是因为 Redshift 是一个列式数据库。列式数据库按列存储表数据,将同一列数据写入存储上的同一块中。这种行为不同于 MySQL 或 PostgreSQL 等基于行的数据库。基于此,由于第一个查询只选择了 colA 列,因此 Redshift 根本不需要访问其他列,而第二个查询访问所有列导致巨大的磁盘访问。

为了提高第二个查询的性能,您可能需要将“sortkey”设置为 colA 列。通过将 sortkey 设置为列,该列数据将按排序顺序存储在存储中。在获取包含该列的条件的记录时,它降低了磁盘访问成本。