2016-07-06 39 views
0

下面是我用我的Postgres的原始查询 -如何在Amazon Redshift中编写此postgres查询,使其与postgres中的优化程序一样优化?

SELECT a.id, 
    (SELECT val 
     FROM database.detail x 
     WHERE name = 'blablah' 
     AND x.id = b.id) AS myGroup, 
    c.username, 
    a.someCode, 
    a.timeTaken, 
    a.date ::timestamp WITH time ZONE AT time ZONE 'PST' AS date, 
    SUM (CASE WHEN (b.name = 'name1') THEN b.val ::INTEGER ELSE 0 END) AS name11, 
    SUM (CASE WHEN (b.name = 'name2') THEN b.val ::INTEGER ELSE 0 END) AS name12 
FROM 
    database.myTable a, 
    database.detail b, 
    database.client c 
WHERE 
    a.id = b.id 
    AND a.c_id = c.c_id 
    AND a.date > current_date - interval '2 weeks' 
GROUP BY 1, 2, 3, 4, 5, 6 

以下是我如何转换此查询到亚马逊红移查询。

SELECT a.id, 
    b.val AS myGroup, 
    c.username, 
    a.someCode, 
    a.timeTaken, 
    convert_timezone('PST', a.date) AS date, 
    SUM (CASE WHEN (b.name = 'name1') THEN b.val ::INTEGER ELSE 0 END) AS name11, 
    SUM (CASE WHEN (b.name = 'name2') THEN b.val ::INTEGER ELSE 0 END) AS name12 
FROM 
    database.myTable a, 
    database.detail b, 
    database.client c 
WHERE 
    a.id = b.id 
    AND b.name = 'blablah' 
    AND a.c_id = c.c_id 
    AND a.date > current_date - interval '2 weeks' 
GROUP BY 1, 2, 3, 4, 5, 6 LIMIT 10 

CASE语句似乎没有执行预期的方式,基本上name11和name12的值都是零。我的postgres查询返回这些值的有效值,但红移查询不。

另外,这个查询非常慢。 Postgres查询需要大约150毫秒,这个查询需要2分钟。

我们该如何做得更好?

回答

1

Redshift查询优化来自于集群,表设计,数据加载,数据吸尘&分析整个表。

让我回答上面列表中的一些核心接触点。 1.确保你的餐桌是mytable,细节,客户端有合适的SORT_KEY,DIST_KEY 2.确保你所有的餐桌加入都已经过分析和适当的预备。

这是用Redshift格式写的同一个SQL的另一个版本。

我做了一些调整,是

  1. 使用上“条款”,以优化集群水平计算
  2. 用于加入适当的方式,确保左/右加盟事宜 基于数据。
  3. 使用date_range和子句表进行对象定位。
  4. 在下面的主SQL中使用Group By。

的我的版本红移SQL

/** Date Range Computation **/ 
with date_range as (
    select (current_Date - interval '2 weeks') as two_weeks 
), 
/** Filter main ResultSet**/ 
myGroupSet as (
    SELECT b.val AS myGroup, 
      c.username, 
      a.someCode, 
      a.timeTaken, 
      (case when (b.name == 'name1') THEN b.val::INTEGER ELSE 0 END) as name11, 
      (case when (b.name == 'name2') THEN b.val::INTEGER ELSE 0 END) as name12 
     FROM database.myTable a, 
     join date_range dr on a.date > dr.two_weeks 
     join database.detail b on b.id = a.id 
     join database.client c on c.c_id = a.c_id 
    where a.date > current_Date - interval '2 weeks' 
) 
/** Apply Aggregation **/ 
select myGroup, username, someCode, timeTaken, date, 
     sum(name1), sum(name2) 
    from myGroupSet 
    group by myGroup, username, someCode, timeTaken, date 
+0

我得到一个错误 - 字符不存在---为myGroupSet为(SELECT b.val AS ....看起来它是不能够访问表b? – Tisha

+0

朋友,SQL只是一个基于你的输入的模拟SQL。请根据你的实际表格和列调整SQL。我分享了一个有关Redshift如何有效的概念以及如何将ANSI SQL转换为兼容Redshift SQL。 – kadalamittai