【问题标题】:Select from a wide table in redshift with where clause on any column从 redshift 中的宽表中选择任何列上的 where 子句
【发布时间】:2019-06-12 00:39:40
【问题描述】:

我有一个超宽表,有 100 列红移。这张表更像是一个矩阵。每个用户一行,每列 1 或 0,具体取决于用户的某些特征。目标是从该表中选择 SQL 获得最佳响应时间。我们预计表中的总行数约为 1.6 亿行,选择将返回约 3000 万行。选择通常基于 1 列之一。

表格看起来像user_id, col1, col2.....col100

例如:

select * from table 1 where col10=1;

然后使用此结果集,UI 将显示多列之间的交叉用户。目前表现非常糟糕。哪些 distkey 或 sortkey 选项可以提高查询性能?

【问题讨论】:

    标签: amazon-web-services amazon-redshift


    【解决方案1】:

    任何返回 3000 万行的 SELECT 语句总是会导致性能不佳。

    鉴于WHERE 语句可以在数百个布尔列中的任何一个上,SORTKEY 无法对其进行优化。但是,响应缓慢的最大原因是需要返回数百万行。

    如果您要跨数百万(甚至数十亿)行进行计算,Redshift 非常出色,例如:

    SELECT COUNT(*) FROM table1 WHERE col10 = 1;
    

    这将返回一行。

    但是,SELECT * 将返回数百万行,每行包含数百列,因此您面临从数据库到客户端的网络延迟。这是大量数据您正尝试发送的数据。

    如果您只询问感兴趣的列会有所帮助,例如:

    SELECT user_id FROM table1 WHERE col10 = 1;
    

    但是这仍然会返回大量数据。

    因此,如果您确实需要返回所有这些行,那么您可能需要创建某种形式的缓存层来在本地存储该数据。

    【讨论】:

      猜你喜欢
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      相关资源
      最近更新 更多