Mengapa "Pilih * ke dalam target dari" sumber lebih cepat dari "masukkan ke dalam target * dari dari sumber

9

Judul ini adalah pertanyaannya. Saya ingin tahu jawabannya. Seseorang memberi tahu

pilih ke minimal login di database model pemulihan sederhana ... Saya tidak masuk sama sekali.

Kutipan dari Microsoft:

Jumlah logging untuk SELECT ... INTO tergantung pada model pemulihan yang berlaku untuk database. Di bawah model pemulihan sederhana atau model pemulihan log-massal, operasi massal dicatat secara minimal. Dengan pencatatan minimum, menggunakan pernyataan SELECT… INTO bisa lebih efisien daripada membuat tabel dan kemudian mengisi tabel dengan pernyataan INSERT

Mencari bantuan

Terima kasih


sumber
Database apa yang Anda gunakan? Apa struktur tabelnya? Bagaimana Anda mengukur bahwa yang satu lebih cepat dari yang lain?
Saya akan terkejut jika ada perbedaan pada DBMS yang ditulis dengan baik.
Database: Sql server 20005 ... dan saya mendengar ini .. bahkan saya tidak 100% yakin ... Saya mencari apa yang dikatakan orang lain .. Seperti yang saya sebutkan bahwa seseorang memberi tahu saya ini ..
Menemukan tautan yang mengonfirmasi bahwa SELECT INTOdapat di- log minimal saat tidak menggunakan Pemulihan Penuh.
Damien_The_Unbeliever

Jawaban:

10

Beberapa ide / teori:

SELECT INTO ... memungkinkan RDBMS menentukan urutan sortir berdasarkan urutan tabel asli Anda. Jika Anda memasukkan ke dalam tabel yang ada, mungkin ada semacam yang diperlukan untuk mencocokkan indeks berkerumun atau tidak tercakup.

Tanpa Indeks - ketika Anda SELECT INTO..., RDBMS tahu dengan pasti, tidak ada indeks yang sudah ada untuk diperbarui.

Tidak Ada Pertentangan - karena tabel yang Anda masukkan tidak ada, SQL Server tidak perlu khawatir tentang penguncian tingkat baris atau penanganan pertengkaran. Tidak ada lagi yang bisa mereferensikan tabel yang Anda buat karena tidak ada.

Semua yang dikatakan, ada cara lain untuk memasukkan tabel dengan sangat cepat.

  • Pastikan kunci indeks berkerumun Anda cocok bila memungkinkan. Ini berarti tidak ada penyortiran on-the-fly

  • Nonaktifkan semua indeks yang tidak berkerumun. Cukup jelas.

  • Atur mode pemulihan ke sederhana dan lacak flag 610 ke ON. Gunakan TABLOCKpetunjuk di tabel target Anda dan NOLOCKpetunjuk di tabel sumber Anda.

Misalnya, anggap tablea dan tableb memiliki indeks berkerumun yang sama:

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

Dalam pengalaman saya ini lebih cepat daripada menggunakan SELECT INTO...dan kemudian membuat indeks berkerumun sesudahnya. Harap perhatikan ini juga dapat berfungsi pada tabel yang sudah memiliki data di dalamnya yang merupakan skenario yang jauh lebih berguna.

EDIT:

Berikut adalah whitepaper fantastis fantastis dari MS untuk kinerja beban data di Sql Server 2008.

JNK
sumber
3
Jawaban JNK sangat teliti. Juga, ketika diimplementasikan dengan benar dan model pemulihan tidak penuh, tugas aliran data SSIS sederhana bisa lebih cepat daripada keduanya. Mengapa? Kedua hal di atas akan mengeluarkan kunci eksklusif (Read adalah multi-utas tetapi tulis adalah utas tunggal). Selama kunci tabel digunakan dengan adaptor tujuan, SSIS akan menggunakan kunci pembaruan massal (Keduanya baca dan tulis multi-utas).
Brian