Saya tahu ini adalah posting lama, tetapi saya pikir ini adalah topik yang sangat penting, terutama saat ini di mana kami memiliki lebih dari 10 juta catatan dan berbicara tentang terabyte data.
Saya juga akan memberi bobot pada observasi berikut. Saya memiliki sekitar 45 juta catatan di tabel saya ([data]), dan sekitar 300 catatan di tabel [kucing] saya. Saya memiliki pengindeksan ekstensif untuk semua kueri yang akan saya bicarakan.
Pertimbangkan Contoh 1:
UPDATE d set category = c.categoryname
FROM [data] d
JOIN [cats] c on c.id = d.catid
versus Contoh 2:
UPDATE d set category = (SELECT TOP(1) c.categoryname FROM [cats] c where c.id = d.catid)
FROM [data] d
Contoh 1 membutuhkan waktu sekitar 23 menit untuk dijalankan. Contoh 2 membutuhkan waktu sekitar 5 menit.
Jadi saya akan menyimpulkan bahwa sub-query dalam kasus ini jauh lebih cepat. Tentu saja perlu diingat bahwa saya menggunakan drive SSD M.2 yang berkemampuan i / o @ 1GB / detik (itu byte bukan bit), jadi indeks saya juga sangat cepat. Jadi ini juga dapat memengaruhi kecepatan dalam keadaan Anda
Jika ini adalah pembersihan data satu kali, mungkin yang terbaik adalah membiarkannya berjalan dan menyelesaikannya. Saya menggunakan TOP (10000) dan melihat berapa lama dan mengalikannya dengan jumlah record sebelum saya mencapai permintaan besar.
Jika Anda mengoptimalkan database produksi, saya sangat menyarankan data pra-pemrosesan, yaitu gunakan pemicu atau perantara kerja untuk memperbarui catatan asinkron, sehingga akses waktu nyata mengambil data statis.