2016-01-10 14 views
5

は、インサートの速度とStackOverflowの上this質問についてインデックス、thisについてthisのOracleドキュメントは結論に私を導く考えてみましょう:INSERTおよびUPDATE操作でどのようにインデックスを使用するのですか?

  • インデックスは私たちがより速く
  • プライマリキーと一意キーが自動的に
  • をインデックス化されている情報を見つけることができますインデックスを挿入すると、パフォーマンスが低下する可能性があります。

ただし、インデックスが議論されるたびにSELECT操作を例として示します。

私の質問はです:INSERTUPDATEで使用されているインデックスですか?いつ、どのように?

私の提案は、次のとおりです。

  • UPDATE(句のカラムがインデックスを持っている場合)SELECTを使用しています(ただし、この場合には、インデックスから提示されたとき
  • INSERTがインデックスを使用することができますWHERE句でインデックスを使用することができます別のテーブル)
  • またはおそらく整合性制約をチェック

が、私は、このような深いについての知識を持っていません索引を使用するかどうか。

+2

インデックスには、テーブルに外部キーまたは他のタイプの制約がある場合にINSERTおよびUPDATE操作で使用されます。外部キーに索引を持たない場合、悪名高いTM - 競合イベントを持つことさえできます。Oracleは、作業中の表だけでなく、従属表に対しても索引を使用します。インターネットやドキュメンテーションにはたくさんの資料があるので、ここでそれについて論じるべき点はないと思う。 – stee1rat

+0

あなたのリンク(https://docs.oracle.com/cd/E17952_01/refman-5.1-en/insert-speed.html)の1つは、Oracleではなくmysql用です。両方のデータベースのドキュメントはdocs.oracle.comにありますので、それらを混同するのは簡単です。 – Timekiller

+0

あなたの答えをありがとう。インデックスは私が作業しているテーブルだけでは使用されないことは分かっていました。おそらく、私は何かの後ろにもっと難しいことを期待していました。 :) –

答えて

0

insert文は、インデックスに直接的な利点はありません。しかし、more index on a table cause slower insert operation。索引のない表について考えると、その表に行を追加したい場合は、十分な空き領域があり、その行を格納する表ブロックが見つかります。しかし、そのテーブルにインデックスがある場合、データベースはこれらの新しい行がインデックスを介して見つかったことを確認する必要があります。インデックスを持つテーブルに新しい行を追加するには、インデックスにもエントリする必要があります。これは、挿入操作を倍増させます。 So more index you have, more time you need to insert new rows

update it depends on whether you update indexed column or notの場合。索引付き列を更新しない場合は、パフォーマンスに影響を与えません。 Index can also speed up a update statements if the where conditions can make use of indexes

1

UPDATE文では、索引が高速化できると判断した場合、索引をオプティマイザが使用できます。索引は、更新される行の位置を特定するために使用されます。索引もまた話し方の表であるため、索引付き列が更新されている場合は、明らかに索引も更新する必要があります。一方、WHERE句なしで更新プログラムを実行している場合、オプティマイザはテーブル全体にアクセスする必要があるためインデックスを使用しないことを選択することがありますが、フルテーブルスキャンの方が効率的です(ただし、 )。オプティマイザは、問題のテーブルやインデックスに対して有効な統計情報、影響を受けるデータの種類、ハードウェアのタイプなど、いくつかのパラメータに基づいて実行時にこれらの決定を行います。

INSERTステートメント索引を必要としない場合は、索引も「挿入する」必要があるため、oracleによってアクセスされる必要があります。 INSERTでインデックスを使用できる別のケースは、次のようなINSERTです。

INSERT INTO mytable (mycolmn) 
SELECT mycolumn + 10 FROM mytable; 
関連する問題