Menggunakan Union alih-alih ATAU

Terkadang permintaan yang lambat dapat diperbaiki dengan sedikit memodifikasi kueri. Salah satu contoh tersebut dapat diilustrasikan ketika beberapa nilai dibandingkan dalam klausa WHERE menggunakan operator OR atau IN. Seringkali OR dapat menyebabkan pemindaian indeks atau tabel, yang mungkin bukan rencana eksekusi yang disukai dalam hal konsumsi I / O atau kecepatan permintaan keseluruhan.

Banyak variabel yang berperan ketika optimizer kueri membuat rencana eksekusi. Variabel-variabel ini mencakup banyak karakteristik perangkat keras, pengaturan instance, pengaturan database, statistik (tabel, indeks, yang dihasilkan secara otomatis), serta cara untuk menulis kueri. Di sini kita mengubah cara kita menulis permintaan. Tidak peduli seberapa tak terduga ini terlihat, bahkan jika dua kueri yang berbeda dapat mengembalikan hasil yang sama, jalur yang mereka ikuti dapat sangat berbeda tergantung pada format kueri.

UNION vs ATAU


Untuk sebagian besar pengalaman saya dengan SQL Server, OR biasanya kurang efisien daripada UNION. Apa yang biasanya terjadi dengan ATAU adalah bahwa hal itu sering menyebabkan pemindaian. Ini kadang-kadang mungkin menjadi cara terbaik untuk beberapa kasus, dan saya akan meninggalkannya sebagai artikel terpisah, tetapi secara umum, saya telah menemukan bahwa ketika sejumlah besar entri dipengaruhi, ini adalah alasan utama perlambatan. Jadi mari kita mulai perbandingan kita.

Inilah pernyataan ATAU kami:

SELECT SalesOrderID, * FROM sales.SalesOrderDetail WHERE ProductID = 750 OR ProductID = 953 



Dari rencana eksekusi ini, kami melihat bahwa kami memindai 121.000 baris. (Anda tidak dapat melihat jumlah baris, tetapi itu).

Sekarang kami menjalankan permintaan yang sama, tetapi ditulis menggunakan UNION alih-alih ATAU:

 SELECT [SalesOrderID], * FROM sales.SalesOrderDetail WHERE ProductID = 750 UNION SELECT [SalesOrderID], * FROM sales.SalesOrderDetail WHERE ProductID = 953 



Di sini kita melihat dua cabang operasi. Satu cabang mempengaruhi 358 baris dan yang lainnya 346 baris. Kedua cabang ditemukan untuk melakukan operasi penggabungan yang menggabungkan kedua set hasil. Kami memiliki dua pencarian terpisah, tetapi kami juga memiliki pencarian kunci untuk mendapatkan daftar SELECT yang diperlukan. Ini tidak diperlukan untuk operasi pemindaian, karena kami masih memengaruhi semua lini dalam operasi pemindaian, sehingga data diperoleh selama pemindaian, bukan setelahnya. Ini karena indeks dan baris yang kita butuhkan, bukan ke UNION atau OR. Namun, saya akan mengatakan bahwa pilih juga merupakan faktor dalam memilih pencarian vs pemindaian, tetapi kami akan mengabaikan ini dalam artikel ini.

Penjelasan


Mengapa UNION menyebabkan lebih banyak pencarian daripada pemindaian, karena setiap operasi harus memenuhi persyaratan selektivitas tertentu untuk memenuhi syarat untuk pencarian. (Selektivitas adalah keunikan kolom tertentu yang difilter). ATAU terjadi dalam satu operasi tunggal, jadi ketika selektivitas untuk setiap kolom digabungkan dan melebihi persentase tertentu, maka pemindaian dianggap lebih efisien.

Karena UNION melakukan operasi terpisah untuk setiap operator secara default, selektivitas setiap kolom tidak digabungkan, sehingga memberikan peluang yang lebih baik untuk melakukan pencarian. Sekarang, karena UNION melakukan dua operasi, mereka harus mencocokkan set hasil mereka menggunakan operasi gabungan yang dijelaskan di atas. Ini biasanya bukan operasi yang mahal.

Juga harus dicatat bahwa klausa OR berfungsi dengan cara yang sama dengan pernyataan IN.

Semoga tip ini membantu. Saya percaya bahwa ini sangat berharga ketika bekerja dengan sistem yang membutuhkan konkurensi tinggi.

Source: https://habr.com/ru/post/id464623/


All Articles