「select * into targettable from sourcetable from」が「insert into targettable select * from sourcetable」よりも速い理由


9

このタイトルが問題です。答えを知りたいです。誰かが言った

select intoは最小限のログに記録されます単純な復旧モデルデータベース...私はそれにまったく入りませんでした。

Microsoftからの抜粋:

SELECT ... INTOのログの量は、データベースで有効な復旧モデルによって異なります。単純復旧モデルまたは一括ログ復旧モデルでは、一括操作のログは最小限に抑えられます。最小限のロギングで、SELECT…INTOステートメントを使用すると、テーブルを作成してINSERTステートメントでテーブルを生成するよりも効率的です。

助けを求める

ありがとう


どのデータベースを使用していますか?テーブルはどのような構造ですか?一方が他方よりも速いことをどのように測定しましたか?

適切に作成されたDBMSに違いがあるとしたら、私は驚きます。

データベース:Sql server 20005 ...そして私はこれを聞いた..私は100%確かではありません...私は他の人々が言うことを探しています..

完全復旧を使用していない場合SELECT INTO最小限のログを記録できることを確認するリンクが見つかりました。
Damien_The_Unbeliever

回答:


10

いくつかのアイデア/理論:

SELECT INTO ...を使用すると、RDBMSは元のテーブルの順序に基づいてソート順序を決定できます。既存のテーブルに挿入する場合、クラスター化インデックスまたは非クラスター化インデックスと一致するために必要な並べ替えが必要になる場合があります。

インデックスなし-RDBMSSELECT INTO...が更新する既存のインデックスがないことが確実にわかっている場合。

競合なし -挿入先のテーブルが存在しないため、SQL Serverは行レベルのロックや競合処理について心配する必要がありません。作成したテーブルは存在しないため、それを参照することはできません。

そうは言っても、テーブルにすばやく挿入する方法は他にもあります。

  • 可能な場合は、クラスター化インデックスキーが一致することを確認してください。つまり、オンザフライでのソートはありません。

  • すべての非クラスター化インデックスを無効にします。自明です。

  • リカバリーモードをシンプルに設定し、フラグ610をに設定しONます。使用するTABLOCKターゲット表と上のヒントをNOLOCKあなたのソーステーブルの上にヒント。

たとえば、tableaとtablebに同じクラスター化インデックスがあるとします。

INSERT INTO TableB WITH (TABLOCK)
SELECT <Columns>
FROM TableA WITH (NOLOCK)

私の経験では、これはSELECT INTO...クラスタードインデックスを使用してから作成するよりも高速です。これは、データすでに含まれているテーブルでも機能することに注意してください。これは、はるかに便利なシナリオです。

編集:

Sql Server 2008でのデータロードパフォーマンスに関する、MSのすばらしいホワイトペーパーを以下に示します。


3
JNKに非常に徹底的に答えます。また、正しく実装され、復旧モデルが完全でない場合、単純なSSISデータフロータスクは、これらのどちらよりも速くなる可能性があります。どうして?上記の両方で排他ロックが発行されます(読み取りはマルチスレッドですが、書き込みはシングルスレッドです)。宛先アダプターでテーブルロックが使用されている限り、SSISは一括更新ロックを使用します(読み取りと書き込みの両方がマルチスレッドです)。
ブライアン、2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.