4

私は次のクエリを持っています:

 INSERT INTO table(field, field1)
 SELECT value, value1  FROM table2 e 
 ORDER BY value

これよりも時間がかかりません:

 INSERT INTO table(field, field1)
 SELECT value, value1  FROM table2 e 

誰かが理由を知っていますか?

2番目の実行プランは、SQLがとにかく「順序付け」操作を実行することを示していますが、パフォーマンスは私のものよりも劣っています。

4

2 に答える 2

2

挿入のパフォーマンスは、使用しているインデックスの数と列によって異なります。ソートされていない値の挿入にクラスター化されたインデックスがある場合、table.field非常にコストがかかります(値はソートされていませんfield)。

于 2012-07-13T16:18:20.690 に答える
0

テーブルtable2の値列に非クラスター化インデックスがありますか?値句のテーブルにクラスター化インデックスがありますか?これには2つの理由が考えられます。

1.列の値にはある種の非クラスター化インデックスがあるため、オプティマイザーはこのインデックスを選択して並べ替えを回避します(カバーリングインデックスの場合もありますが、この場合は非常に高速になります)。順序なしのクエリがそのインデックスを選択しなかった理由は、単純なクエリであり、最適化が行われず、クラスター化インデックスまたはテーブルスキャンを実行してからデータを並べ替えたため、順序と比較してパフォーマンスが低下したためです。 。これが最も可能性の高い理由です。

  1. もう1つの理由は、データを挿入するときに、取得したとおりにデータを挿入し、データが順序付けられている場合、同じクラスター化インデックスが列順に挿入されることである可能性があります。ページ分割はなく、問題はありませんが、並べ替えがない場合、値がランダムに挿入され、ページ分割が発生してパフォーマンスがわずかに低下する可能性があります。ただし、OPは、オプティマイザが挿入前にソートを実行したことを示しています。つまり、このシナリオはここでは適用できません。
于 2012-07-13T18:49:26.797 に答える