我试图在Postgres中添加一个带有以下SQL的简单索引,但命令会保持超时:
CREATE INDEX playlist_tracklinks_playlist_enid ON playlist_tracklinks (playlist_enid);
表定义如下:
=> \d playlist_tracklinks
Table "public.playlist_tracklinks"
Column | Type | Modifiers
----------------+---------------+--------------------
playlist_enid | numeric(20,0) | not null default 0
tracklink_enid | numeric(20,0) | not null default 0
position | integer | not null default 1
表中有大约22亿行,并且失败并出现以下错误:
ERROR: canceling statement due to user request
我尝试使用以下内容增加查询超时时间:
SET statement_timeout TO 360000000;
然而它仍然达到了这个门槛。无论有没有CONCURRENTLY
,我都尝试过这种做法。任何建议都将不胜感激。
答案 0 :(得分:1)
你可以尝试使用WHERE
语句索引表的一部分,比如前10k行。然后你可能会看到它是否有效以及需要多长时间。在WHERE
<{1}}使用CREATE INDEX
的参考:http://www.postgresql.org/docs/9.1/static/sql-createindex.html
您的列是否可能包含非唯一数字?这可能会导致问题(在这种情况下,我不确定索引是否需要列上的唯一值)。
答案 1 :(得分:1)
使用numerics
的算术非常慢。这包括构建和使用索引所需的比较。我建议您将enid
类型更改为char(20)
或仅varchar
如果您不对它们执行任何算术(除了比较),如果您这样做,则可能bigint
。对于最大可能的20位数字,Bigint还不够 - 我不知道这些ID带来了什么样的信息,如果它们真的那么大。
答案 2 :(得分:1)
这是Heroku查杀连接(服务器用完了临时空间)。联系Heroku支持最终解决方案......