我遇到以下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,但是在这种情况下,这些并不重要。
答案 0 :(得分:4)
第一个查询更快的主要原因是Redshift是一个柱状数据库。一个柱状数据库 每列存储表数据,将相同的列数据写入存储器上的同一块。此行为与MySQL或PostgreSQL等基于行的数据库不同。基于此,由于第一个查询仅选择colA列,因此Redshift根本不需要访问其他列,而第二个查询访问导致巨大磁盘访问的所有列。
要提高第二个查询的性能,您可能需要设置" sortkey"到colA专栏。通过将sortkey设置为列,该列数据将按存储的排序顺序存储。在获取包含该列的条件的记录时,它可以降低磁盘访问的成本。