2016-07-06 26 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