Setelah membaca permintaan SQL Lambat, tidak yakin bagaimana mengoptimalkan , itu membuat saya berpikir tentang kinerja umum permintaan. Tentunya, kita perlu hasil dari tabel pertama (ketika tabel lain bergabung) menjadi sekecil mungkin sebelum bergabung (bergabung dalam untuk pertanyaan ini) untuk membuat pertanyaan kami yang sedikit lebih cepat lebih cepat.
Contoh, jika ini:
SELECT *
FROM ( SELECT * FROM table1 WHERE col = @val ) t
INNER JOIN table2 ON col = col2
Lebih baik / lebih cepat dari:
SELECT *
FROM table1
INNER JOIN table2 ON col = col2
WHERE table1.col = @val
Teori saya adalah sebagai berikut (ini mungkin bukan implementasi yang benar, saya mencoba mengingat dari buku internal SQL Server 2008 yang saya baca (MSFT Press)):
- Prosesor permintaan pertama mendapatkan tabel kiri (table1)
- Bergabung dengan tabel kedua (table2) dan bentuk produk kartesius sebelum menyaring baris yang diperlukan (jika ada)
- Kemudian lakukan klausa WHERE, ORDER BY, GROUP BY, HAVING dengan pernyataan SEELCT yang terakhir.
Jadi, jika dalam pernyataan # 1 di atas, tabel lebih kecil, mesin SQL memiliki lebih sedikit pekerjaan yang harus dilakukan ketika membentuk produk cartesian. Kemudian ketika Anda mencapai pernyataan di mana, Anda memiliki hasil yang berkurang yang digunakan untuk memfilter dalam memori.
Saya bisa jadi jauh dari sasaran itu tidak nyata. Seperti yang saya katakan, itu teori.
Pikiran Anda?
Catatan : Saya baru saja memikirkan pertanyaan ini dan belum sempat menjalankan tes sendiri.
Catatan 2 : Ditandai sebagai SQL Server karena saya tidak tahu apa - apa tentang implementasi MySql, dll. Silakan jawab / komentar saja
sumber