2012-01-22 4 views
3

インデックスを作成するための巨大なデータベースがあります。そこには膨大な量の情報を挿入し、千塊に分割します。 1つが挿入されるたびに、インデックスが更新されます。問題は、情報を挿入するのに要する時間がジャーナルファイルを300メガ以上にまで上げるこれらの巨大なトランザクションのために100周ぐらいのあいだに非常に長くなってしまうことです。インデックスの更新を延期する方法はありますか?

索引がスキーマ内に定義されたままであり、すべての表にデータが移入された後に更新索引(場合によってはFREEZE INDEXコマンドなど)を延期する方法はありますか?

私はこれがすでにDROP INDEXCREATE INDEXによって達成できることを知っていますが、私はやや洗練された解決策、あるいは恐らくトリックを探していました。

残念ながら、DBMSを簡単に変更することはできません。また、PostgreSQLを使用して調査することもできます。

答えて

3

DROP INDEX/CREATE INDEXを使用しない理由が他にもあります。私はあなたがスケジュールされたメンテナンス中にこの一括負荷を行っていると仮定します? DROP INDEX/CREATE INDEXは、バルクデータロードではかなり標準的な手順です。最終的にクラスタ化されていないインデックスを再作成することで、DBが最も効率的なインデックス構造を作成できるようになります(データに対するクエリが高速に実行されます)。

データベースによっては、これらの詳細をユーザーに表示しないようにする追加機能があります(SQLサーバーではインデックスを無効/有効にできます)が、DROP INDEX/CREATE INDEXを有効に実行しています。

また、「フリーズインデックス」があっても何も保存しません。多くのデータを入力する場合は、最後にインデックスを完全に再構築することが最善です(これは実質的に "DROP INDEX/CREATE INDEX"のように機能します)。

ジャーナルが大きすぎる場合は、挿入をさらに小さなトランザクションチャンクに分割する必要がありますか?

+0

トランザクションで実行された場合、sqlliteはトランザクションがコミットするときにのみインデックスを更新します。その間、インデックスは最適なソリューションのように見える他のクエリでも使用できます。 – Ilion

+0

@llion "その他のクエリ"? SQLiteはパラレルクエリを適切に処理できることで知られていません。データを変更するトランザクションを開始すると、データベースは完了するまで他のクエリにロックされます。 – amphetamachine

1

トランザクション内(またはトランザクションを含むバッチ)でインサートを実行したいとします。インデックスは、コミットすると更新されます。

関連する問題