2016-03-30 15 views
0

中規模のテーブル(60GB、5億行)を投入しています。テーブルにプライマリキーがない場合(一括挿入を使用して〜1時間)にはプロセスはかなり速く完了しますが、プライマリキーを使用してそのテーブルを作成すると〜10倍の時間がかかります。これは、一意性制約を検証し、各挿入時にインデックスを更新するのに時間がかかるためと考えています。主キーのパフォーマンスの問題

すでに実装されている表の索引付けは、増分索引付けに比べてはるかに高速でなければならないため、後で主キーを追加することをお勧めします。しかし、sqliteは、テーブルが作成された後にプライマリキーを追加するオプションを持っていないようです(理由は分かりませんか?)。

私は、プライマリキーをまったく使用することはできず、代わりに表が移入された後にユニークなインデックスを追加することができると思います。それに不利な点はありますか?

その他の推奨ソリューションはありますか?

答えて

1

、一意のインデックスは、主キーとまったく同じ効果があります。 (SQLiteでは、いくつかの主キーは下位互換性のためにNULLを許可します)。

唯一の違いは、主キー制約がテーブル定義自体に表示されないことです。

Is CREATE UNIQUE INDEX or INTEGER PRIMARY KEY more performant in SQLiteも参照してください。

+0

しかし、あなたのリンクされた答えによると、プライマリキーはINTEGERカラムにあるとパフォーマンス上の利点がありますか? – max

+0

はい、テーブルが異なるタイプを使用していました。 –

+1

INTEGER PRIMARY KEYは挿入の速度を落とさないでしょう。 –

0

トランザクション内で一括挿入を実行すると、挿入が遅くなることはほとんどありません。

私はこれを見つけました。これは、sqlite3で処理を高速化する方法についての素晴らしい記事です。ビューの純粋に技術的な観点から

Improve INSERT-per-second performance of SQLite?