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たが、何をすべきか途方に暮れています。どんな提案でも大歓迎です。

4

3 に答える 3

1

の算術演算numericsは非常に遅いです。これには、インデックスを作成して使用するために必要な比較が含まれます。enid型をchar(20)or に変更することをお勧めしますvarchar(比較以外の) 演算を行わない場合、または行う場合はおそらくbigint。Bigint は、考えられる最大の 20 桁の数値には十分ではありません。この ID が実際にそれほど大きくなる可能性がある場合、この ID がどのような種類の情報を保持しているかはわかりません。

于 2013-09-18T16:59:32.893 に答える
1

WHEREステートメントを使用して、最初の 10,000 行など、テーブルの一部にインデックスを付けてみることができます。次に、それが機能するかどうか、およびどれくらいの時間がかかるかを確認できる場合があります. ここで使用WHEREするための参照: http://www.postgresql.org/docs/9.1/static/sql-createindex.htmlCREATE INDEX

列に一意でない数値が含まれている可能性はありますか? これにより、問題が発生する可能性があります (この場合、インデックスが列に一意の値を必要とするかどうかはわかりません)。

于 2013-09-17T01:46:48.930 に答える
1

Heroku が接続を切断していました (サーバーが一時スペースを使い果たしました)。Herokuサポートに連絡することが最終的な解決策でした...

于 2013-09-25T18:13:38.080 に答える