PostgreSQL:如何在没有超时的情况下在非常大的表上创建索引?

时间:2013-09-17 01:07:08

标签: sql postgresql postgresql-9.2

我试图在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,我都尝试过这种做法。任何建议都将不胜感激。

3 个答案:

答案 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支持最终解决方案......