Hanya menebak:
Saat Anda menjalankan kueri dengan tangan, ekspresi WHERE ('test' IS NULL or COL1 = 'test')
dapat dioptimalkan ketika kueri sedang diuraikan. Pengurai dapat melihat bahwa string 'test'
bukan nol, jadi ini mengubah tes menjadi WHERE COL1 = 'test'
. Dan jika ada indeks di COL1
ini akan digunakan.
Namun, saat Anda membuat prosedur tersimpan, penguraian terjadi saat prosedur dibuat. Saat itu, tidak tahu apa @param
akan, dan harus mengimplementasikan kueri sebagai pemindaian tabel berurutan.
Coba ubah prosedur Anda menjadi:
IF @param IS NULL
THEN BEGIN
SELECT * FROM table1
UNION ALL
SELECT * FROM table2
...
END;
ELSE BEGIN
SELECT * FROM table1 WHERE col1 = @param
UNION ALL
SELECT * FROM table2 WHERE col1 = @param
...
END;
END IF;
Saya tidak memiliki banyak pengalaman dengan prosedur tersimpan MySQL, jadi saya tidak yakin itu semua sintaks yang benar.