亚马逊Redshift查询神秘死亡

时间:2015-09-17 11:35:23

标签: sql postgresql amazon-redshift

为什么我的Amazon Redshift查询有时会起作用,有时会被杀死,有时内存不足?

这是一个简单的查询:

dev=# EXPLAIN SELECT row_number, browser_cookie, "timestamp", request_path,
                     status,     outcome,         duration,   referrer
       FROM annotated_apache_logs
      WHERE date = '2015-09-15';
                                         QUERY PLAN                                          
------------------------------------------------------------------------------------
 XN Seq Scan on annotated_apache_logs  (cost=0.00..114376.71 rows=9150137 width=207)
   Filter: (date = '2015-09-15'::date)

拉出约900万行:

dev=# SELECT count(*) FROM annotated_apache_logs WHERE date = '2015-09-15';
  count  
---------
 9150137
(1 row)

窒息:

dev=# SELECT row_number, browser_cookie, "timestamp", request_path,
             status,     outcome,        duration,    referrer
        FROM annotated_apache_logs
       WHERE date = '2015-09-15';
out of memory

有时sql会说Killed。有时它有效。有时我得到out of memory。不知道为什么。该表看起来像这样(我已删除了上述查询中没有的行):

CREATE TABLE IF NOT EXISTS annotated_apache_logs (
  row_number           double precision,
  browser_cookie       character varying(240),
  timestamp            integer,
  request_path         character varying(2500),
  status               character varying(12),
  outcome              character varying(128),
  duration             integer,
  referrer             character varying(2500)
)
DISTKEY (date)
SORTKEY (browser_cookie);

我努力工作以尽可能减少所有这些列以减少内存使用量。我现在要找什么?如果我正确读取EXPLAIN输出,这可能会返回几个数据。没有太多的数据,没有连接,没有什么花哨的。对于一个" PB级数据仓库",这是微不足道的,所以我假设我在这里缺少一些基本的东西。

2 个答案:

答案 0 :(得分:1)

您应该使用游标以块的形式获取结果集。见http://docs.aws.amazon.com/redshift/latest/dg/declare.html

  

如果客户端应用程序使用ODBC连接,并且查询创建的结果集太大而无法放入内存,则可以使用游标将结果集流式传输到客户端应用程序。当您使用游标时,整个结果集在领导节点上实现,然后您的客户端可以逐步获取结果。

编辑: 假设您需要整个结果集而不是使用where / limit进行过滤。

答案 1 :(得分:1)

如果您的查询实际上内存不足,请检查运行此查询的WLM队列的并发性。尝试增加此队列的可用内存或减少并发性,这将允许您的查询具有更多内存。

P.S: 当它显示“Petabyte scale”时,并不意味着它拥有PB的RAM。决定执行时查询实际获得的内存有很多因素, 您使用的节点类型是什么? 多少个节点? 运行此查询时还在运行哪些其他查询?