Salah satu rekan kerja saya menyebutkan prosedur tersimpan di database SQL Server 2008 R2 kami sp_something
. Ketika saya melihat ini, saya langsung berpikir: "Itu SALAH!" dan mulai mencari bookmark saya untuk artikel online ini yang menjelaskan mengapa itu salah, jadi saya bisa memberikan penjelasan kepada rekan kerja saya.
Dalam artikel (oleh Brian Moran ) dijelaskan bahwa memberikan prosedur tersimpan awalan sp_ membuat SQL Server melihat pada master database untuk rencana yang dikompilasi. Karena sp_sproc
tidak berada di sana, SQL Server akan mengkompilasi ulang prosedur (dan memerlukan kunci kompilasi eksklusif untuk itu, menyebabkan masalah kinerja).
Contoh berikut diberikan dalam artikel untuk menunjukkan perbedaan antara dua prosedur:
USE tempdb;
GO
CREATE PROCEDURE dbo.Select1 AS SELECT 1;
GO
CREATE PROCEDURE dbo.sp_Select1 AS SELECT 1;
GO
EXEC dbo.sp_Select1;
GO
EXEC dbo.Select1;
GO
Anda menjalankan ini, lalu buka Profiler (tambahkan Prosedur Disimpan -> SP:CacheMiss
acara) dan jalankan prosedur yang tersimpan lagi. Anda seharusnya melihat perbedaan antara dua prosedur tersimpan: prosedur sp_Select1
tersimpan akan menghasilkan satu SP:CacheMiss
peristiwa lebih dari Select1
prosedur tersimpan (artikel referensi SQL Server 7.0 dan SQL Server 2000. )
Ketika saya menjalankan contoh di lingkungan SQL Server 2008 R2 saya, saya mendapatkan jumlah SP:CacheMiss
peristiwa yang sama untuk kedua prosedur (baik di tempdb dan di database pengujian lain).
Jadi saya bertanya-tanya:
- Bisakah saya melakukan sesuatu yang salah dalam eksekusi contoh saya?
Apakahsproc sp_something
adagium 'jangan beri nama pengguna ' masih valid di versi SQL Server yang lebih baru?- Jika demikian, apakah ada contoh yang baik yang menunjukkan validitasnya dalam SQL Server 2008 R2?
Terima kasih banyak atas pemikiran Anda tentang ini!
EDIT
Saya menemukan Membuat Prosedur yang Disimpan (Database Engine) di msdn untuk SQL Server 2008 R2, yang menjawab pertanyaan kedua saya:
Kami menyarankan Anda untuk tidak membuat prosedur tersimpan menggunakan sp_ sebagai awalan. SQL Server menggunakan awalan sp_ untuk menunjuk prosedur yang tersimpan sistem. Nama yang Anda pilih mungkin bertentangan dengan beberapa prosedur sistem di masa depan. [...]
Tidak ada yang disebutkan di sana tentang masalah kinerja yang disebabkan oleh penggunaan sp_
awalan. Saya ingin tahu apakah itu masih terjadi atau apakah mereka memperbaikinya setelah SQL Server 2000.
sp_
? Ini sama bermanfaatnya dengan awalan tabel dengan tbl
. Mengapa membuat master pencarian sistem terlebih dahulu (bahkan jika itu diabaikan atau tidak ada perbedaan kinerja) untuk memungkinkan Anda menggunakan konvensi penamaan yang tidak berarti ini?
dbo.sp_Author_Rename
lebih baik daripada dbo.Author_Rename
. Saya tidak dapat memikirkan satu hal pun yang masuk akal.
sp_
versi (perlu memeriksa di master dan database pengguna karena memprioritaskan procs sistem dimaster
-> procs di DB pengguna -> bukan sistem procs inmaster
)