[解決済み] インデックスを作成するのは、テーブルにデータを格納する前と、データが格納された後、どちらが良いですか?
2022-12-28 08:53:26
質問
約100M行のテーブルがあり、コピーしてインデックスを追加して変更しようと思っています。 新しいテーブルの作成にかかる時間はそれほど気にしていませんが、データを挿入する前にテーブルを変更する場合、または先にデータを挿入してからインデックスを追加する場合、作成したインデックスはより効率的でしょうか?
どのように解決するのですか?
データ挿入後にインデックスを作成するのが効率的です(バッチインポート前にインデックスを削除し、インポート後にインデックスを再作成することが推奨されることもあります)。
構文例(PostgreSQL 9.1、低速開発機、100万行)。
CREATE TABLE test1(id serial, x integer);
INSERT INTO test1(id, x) SELECT x.id, x.id*100 FROM generate_series(1,1000000) AS x(id);
-- Time: 7816.561 ms
CREATE INDEX test1_x ON test1 (x);
-- Time: 4183.614 ms
挿入とインデックスの作成 - 約12秒
CREATE TABLE test2(id serial, x integer);
CREATE INDEX test2_x ON test2 (x);
-- Time: 2.315 ms
INSERT INTO test2(id, x) SELECT x.id, x.id*100 FROM generate_series(1,1000000) AS x(id);
-- Time: 25399.460 ms
インデックスを作成してから挿入 - 約25.5秒 (2倍以上遅い)
関連
-
[解決済み] オフセット無視のデータタイムとオフセット考慮のデータタイムを引き算できない
-
[解決済み] Oracle Trigger ORA-04098: トリガーが無効で、再バリデーションに失敗しました。
-
[解決済み] SQL Server : 列を行に変換する
-
[解決済み] MySQLで'insert if not exists'を行うにはどうしたらいいですか?
-
[解決済み] MySQLでFULL OUTER JOINを行うにはどうすればよいですか?
-
[解決済み] コマンドライン引数でPostgreSQLの.sqlファイルを実行する
-
[解決済み] SQLite - UPSERT *not* INSERT or REPLACE
-
[解決済み] MySQLでibdata1ファイルを縮小/パージする方法
-
[解決済み] SQL Serverで結果をページ分割する最も良い方法は何ですか?
-
[解決済み】ドッカー化したPostgreSQLデータベースのバックアップ/リストア
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
plsql-stored-procedure ORA-06550 エラー処理
-
[解決済み] ストアドプロシージャ 'dbo.aspnet_CheckSchemaVersion' が見つかりませんでした。
-
[解決済み] Oracleで上位100行を選択する方法は?
-
[解決済み] テーブルネーミングのジレンマ:単数形と複数形の名前【非公開
-
[解決済み] SQLのIN句をパラメータ化する
-
[解決済み] 最初の行への結合方法
-
[解決済み] T-SQLでnot equalには!=と<>のどちらを使うべきですか?
-
[解決済み] SQL Server における DateTime2 と DateTime の比較
-
[解決済み] SQLの複数列の順序付け
-
[解決済み] Count()で条件を指定することは可能ですか?