Redshift选择* vs选择单列

时间:2016-02-09 19:23:18

标签: database-performance amazon-redshift

我遇到以下Redshift性能问题:

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

以下查询:

select colA from tableA where intCol = ‘111111’;

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

然而,查询:

select * from tableA where intCol = ‘111111’;

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

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

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

1 个答案:

答案 0 :(得分:4)

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

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