为什么我的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级数据仓库",这是微不足道的,所以我假设我在这里缺少一些基本的东西。
答案 0 :(得分:1)
您应该使用游标以块的形式获取结果集。见http://docs.aws.amazon.com/redshift/latest/dg/declare.html
如果客户端应用程序使用ODBC连接,并且查询创建的结果集太大而无法放入内存,则可以使用游标将结果集流式传输到客户端应用程序。当您使用游标时,整个结果集在领导节点上实现,然后您的客户端可以逐步获取结果。
编辑: 假设您需要整个结果集而不是使用where / limit进行过滤。
答案 1 :(得分:1)
如果您的查询实际上内存不足,请检查运行此查询的WLM队列的并发性。尝试增加此队列的可用内存或减少并发性,这将允许您的查询具有更多内存。
P.S: 当它显示“Petabyte scale”时,并不意味着它拥有PB的RAM。决定执行时查询实际获得的内存有很多因素, 您使用的节点类型是什么? 多少个节点? 运行此查询时还在运行哪些其他查询?