Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Klausa WHERE lebih baik dieksekusi sebelum IN dan JOIN atau sesudahnya

Dalam kasus INNER JOIN atau tabel di sebelah kiri dalam LEFT JOIN, dalam banyak kasus, pengoptimal akan menemukan bahwa lebih baik melakukan pemfilteran apa pun terlebih dahulu (selektivitas tertinggi) sebelum benar-benar melakukan jenis gabungan fisik apa pun - jadi ada jelas merupakan urutan operasi fisik yang lebih baik.

Sampai batas tertentu Anda terkadang dapat mengontrol ini (atau mengganggu ini) dengan SQL Anda, misalnya, dengan agregat dalam subkueri.

Urutan logis pemrosesan kendala dalam kueri hanya dapat diubah sesuai dengan transformasi invarian yang diketahui.

Jadi:

SELECT *
FROM a
INNER JOIN b
    ON a.id = b.id
WHERE a.something = something
    AND b.something = something

masih secara logis setara dengan:

SELECT *
FROM a
INNER JOIN b
    ON a.id = b.id
    AND a.something = something
    AND b.something = something

dan mereka umumnya akan memiliki rencana eksekusi yang sama.

Sebaliknya:

SELECT *
FROM a
LEFT JOIN b
    ON a.id = b.id
WHERE a.something = something
    AND b.something = something

TIDAK setara dengan:

SELECT *
FROM a
LEFT JOIN b
    ON a.id = b.id
    AND a.something = something
    AND b.something = something

sehingga pengoptimal tidak akan mengubahnya menjadi rencana eksekusi yang sama.

Pengoptimal sangat cerdas dan mampu memindahkan berbagai hal dengan cukup sukses, termasuk menciutkan tampilan dan fungsi bernilai tabel sebaris serta bahkan mendorong berbagai hal melalui beberapa jenis agregat dengan cukup berhasil.

Biasanya, ketika Anda menulis SQL, SQL harus dapat dimengerti, dapat dipelihara, dan benar. Sejauh efisiensi dalam eksekusi, jika pengoptimal mengalami kesulitan mengubah SQL deklaratif menjadi rencana eksekusi dengan kinerja yang dapat diterima, kode terkadang dapat disederhanakan atau indeks atau petunjuk yang sesuai ditambahkan atau dipecah menjadi langkah-langkah yang harus tampil lebih cepat - semuanya dalam urutan invasif yang berurutan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tipe data untuk menyimpan alamat ip di SQL Server

  2. Bagaimana saya bisa MEMILIH beberapa kolom dalam CASE WHEN di SQL Server?

  3. Perbedaan Antara Fungsi Bernilai Tabel Multi-Pernyataan &Fungsi Bernilai Tabel Sebaris di SQL Server

  4. Cara Menonaktifkan Semua Batasan PERIKSA &Kunci Asing dalam Database di SQL Server (Contoh T-SQL)

  5. Lima Pertimbangan Teratas untuk Desain Indeks Basis Data di SQL Server