2017-08-04 55 views
0

我已經構建了一個系統,其中數據從s3每隔幾分鐘(從kinesis firehose)加載到redshift中。然後我從該主表中獲取數據並將其分成每個客戶的表格。無法優化Redshift查詢

主表有幾億行。

create table {$table} as select * from {$source_table} where customer_id = '{$customer_id} and time between {$start} and {$end}' 

我定義爲鍵:

SORTKEY (customer_id, time) 
DISTKEY customer_id 

一切我已閱讀表明,這將是構建我的表的最佳方式

創建子表與這樣的查詢做/查詢但性能是絕對糟糕的。即使僅選擇幾行,構建子表也需要花費一分鐘。

我是否錯過了某些東西或者我只需要縮放羣集?

+0

主表或子表上的那些DISTKEY和SORTKEYs?如果將查詢作爲SELECT而不是CREATE TABLE運行,那麼需要多長時間才能執行? –

+0

SELECT和CREATE TABLE的性能幾乎相同。 –

回答

1

如果你沒有更好的密鑰,你可能不得不考慮使用DISTSTYLE EVEN,保持相同的排序關鍵。

理想情況下,分發密鑰應該是在連接中使用的值,並將您的數據在整個集羣中均勻分佈。通過使用customer_id作爲分配密鑰,然後使用該密鑰進行過濾,就可以迫使所有工作僅在一個片上完成。

要在操作中查看此操作,請查看系統表。首先,找到一個例子查詢:

SELECT * 
FROM stl_query 
WHERE userid > 1 
ORDER BY starttime DESC 
LIMIT 10; 

然後,看看bytes每片爲您的每一步查詢在svl_query_report

SELECT * 
FROM svl_query_report 
WHERE query = <your query id> 
ORDER BY query,segment,step,slice; 

有關設計最好的表結構有一個非常詳細的指南看看我們的"Amazon Redshift Engineering’s Advanced Table Design Playbook"

+0

這是有道理的,我會嘗試均勻分佈,以提高性能。 –