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

pilihan operator pengoptimal kueri - loop bersarang vs pencocokan hash (atau penggabungan)

SANGAT. Pertandingan hash akan menjadi peningkatan besar. Membuat hash pada tabel baris 19.223 yang lebih kecil kemudian menyelidikinya dengan tabel baris 65.991 yang lebih besar adalah operasi yang jauh lebih kecil daripada loop bersarang yang membutuhkan 1.268.544.993 perbandingan baris.

Satu-satunya alasan server akan memilih loop bersarang adalah karena terlalu meremehkan jumlah baris yang terlibat. Apakah tabel Anda memiliki statistik, dan jika demikian, apakah mereka diperbarui secara berkala? Statistiklah yang memungkinkan server memilih rencana eksekusi yang baik.

Jika Anda telah menangani statistik dengan benar dan masih mengalami masalah, Anda dapat memaksanya untuk menggunakan gabungan HASH seperti:

SELECT *
FROM
   TableA A -- The smaller table
   LEFT HASH JOIN TableB B -- the larger table

Harap dicatat bahwa saat Anda melakukan ini, itu juga akan memaksa pesanan bergabung. Ini berarti Anda harus mengatur semua tabel Anda dengan benar sehingga urutan bergabungnya masuk akal. Umumnya Anda akan memeriksa rencana eksekusi yang sudah dimiliki server dan mengubah urutan tabel Anda dalam kueri agar sesuai. Jika Anda tidak terbiasa dengan cara melakukannya, dasarnya adalah bahwa setiap input "kiri" didahulukan, dan dalam rencana eksekusi grafis, input kiri adalah bawah satu. Gabungan kompleks yang melibatkan banyak tabel mungkin harus mengelompokkan gabungan di dalam tanda kurung, atau gunakan RIGHT JOIN untuk mendapatkan rencana eksekusi yang optimal (tukar input kiri dan kanan, tetapi perkenalkan tabel pada titik yang benar dalam urutan bergabung).

Biasanya yang terbaik adalah menghindari penggunaan petunjuk bergabung dan memaksa urutan bergabung, jadi lakukan apa pun yang Anda bisa terlebih dahulu! Anda dapat melihat indeks pada tabel, fragmentasi, pengurangan ukuran kolom (seperti menggunakan varchar bukannya nvarchar di mana Unicode tidak diperlukan), atau membagi kueri menjadi beberapa bagian (masukkan ke tabel temp terlebih dahulu, lalu gabungkan ke dalamnya).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa itu DTU di Database Azure SQL dan Bagaimana Mengetahui Berapa Banyak yang Kita Butuhkan

  2. Berisi () fungsi terputus-putus dengan string angka?

  3. Kesalahan - Transaksi yang terkait dengan koneksi saat ini telah selesai tetapi belum dihapus

  4. Encoding Cyrillic dalam C#

  5. SIN() Contoh di SQL Server