Saya memiliki kueri di tabel besar yang terlihat seperti ini:
declare @myIdParam int = 1
select *
from myTable
where (@myIdParam is null or myTable.Id = @myIdParam)
Ada beberapa persyaratan serupa seperti ini di mana klausa, dan ada juga banyak bergabung, tetapi ini adalah ringkasan.
Secara efektif, jika @myIdParam adalah nol, kami tidak ingin membatasi hasil menggunakan parameter ini.
Saya bukan pro DB, tetapi dari tes saya sepertinya pemeriksaan NULL ini dilakukan untuk setiap catatan dan tidak dioptimalkan dengan cara apa pun.
Jika saya menghapus centang nol dan menganggap parameternya bukan nol, kueri kembali seketika. Kalau tidak, dibutuhkan hingga sepuluh detik.
Apakah ada cara untuk mengoptimalkan ini sehingga pemeriksaan dilakukan hanya sekali saat runtime?
sql-server
null
Mystagogue
sumber
sumber
OPTION(RECOMPILE)
Jawaban:
Salah satu caranya adalah dengan menggunakan SQL dinamis, menggunakan tanda centang nol untuk menambahkan bagian klausa mana.
sumber
sp_ExecuteSQL
tidak ada dan@vc_dynamicsql
parameternya harus aNVARCHAR
.Setiap kali Anda meletakkan fungsi di sekitar kolom `ISNULL (@var, table.col) 'misalnya Anda menghapus kemampuan SQL untuk menggunakan indeks. Ini benar-benar adalah opsi berkinerja terbaik jika Anda ingin menyimpannya dalam satu permintaan.
Kalau tidak, Anda memiliki dua opsi. Yang pertama adalah SQL dinamis dan jawaban @ Mystagogue sudah cukup untuk itu jika tidak Anda bisa memasukkan dua pertanyaan seperti ini:
Baik dalam format ini maupun SQL dinamis, Anda sebenarnya akan mendapatkan rencana kueri yang berbeda untuk setiap kueri (yang berpotensi menghasilkan kinerja yang lebih baik).
sumber
Anda bisa:
Perlu diingat, bahwa
nullif()
fungsi tersebut pada dasarnya adalah pembungkuscase
. Ini bukan peluru perak yang secara ajaib menghilangkanOR
dan dengan demikian mempercepat kueri.sumber
UNION
. Ketika saya memiliki tugas yang tepat ini, saya memilih SQL dinamis.