หนึ่งในเพื่อนร่วมงานของฉันตั้งชื่อกระบวนงานที่เก็บไว้ในฐานข้อมูล SQL Server 2008 R2 ของsp_something
เรา เมื่อฉันเห็นสิ่งนี้ฉันก็คิดทันที: "นั่นมันผิด!" และเริ่มค้นหาบุ๊กมาร์กของฉันสำหรับบทความออนไลน์นี้ซึ่งอธิบายว่าทำไมมันผิดดังนั้นฉันจึงสามารถให้คำอธิบายแก่เพื่อนร่วมงานของฉันได้
ในบทความ (โดยBrian Moran ) มีการอธิบายว่าการให้ขั้นตอนการจัดเก็บคำนำหน้าsp_ทำให้ SQL Server ดูที่ฐานข้อมูลหลักสำหรับแผนรวบรวม เนื่องจากsp_sproc
ไม่ได้อยู่ที่นั่น SQL Server จะคอมไพล์โพรเซสอีกครั้ง
ตัวอย่างต่อไปนี้ให้ไว้ในบทความเพื่อแสดงความแตกต่างระหว่างสองขั้นตอน:
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
คุณรันสิ่งนี้จากนั้นเปิด Profiler (เพิ่มกระบวนงานที่เก็บไว้ -> SP:CacheMiss
เหตุการณ์) และเรียกใช้กระบวนงานที่เก็บไว้อีกครั้ง คุณควรจะเห็นความแตกต่างระหว่างสองกระบวนงานที่เก็บไว้: กระบวนงานที่sp_Select1
เก็บไว้จะสร้างSP:CacheMiss
เหตุการณ์เพิ่มเติมมากกว่าหนึ่งSelect1
กระบวนงานที่เก็บไว้ (บทความอ้างอิงSQL Server 7.0และSQL Server 2000 )
เมื่อฉันรันตัวอย่างในสภาพแวดล้อม SQL Server 2008 R2 ของฉันฉันจะได้รับSP:CacheMiss
เหตุการณ์จำนวนเท่ากันสำหรับทั้งสองโพรซีเดอร์ (ทั้งใน tempdb และในฐานข้อมูลทดสอบอื่น)
ดังนั้นฉันสงสัย:
- ฉันสามารถทำสิ่งผิดพลาดในการดำเนินการตามตัวอย่างได้หรือไม่?
sproc sp_something
adagium ' ไม่ตั้งชื่อผู้ใช้' ยังคงใช้ได้ใน SQL Server รุ่นที่ใหม่กว่าหรือไม่- ถ้าเป็นเช่นนั้นมีตัวอย่างที่ดีที่แสดงความถูกต้องใน SQL Server 2008 R2 หรือไม่
ขอบคุณมากสำหรับความคิดของคุณในเรื่องนี้!
แก้ไข
ฉันพบการสร้างกระบวนงานที่เก็บไว้ (โปรแกรมฐานข้อมูล)บน msdn สำหรับ SQL Server 2008 R2 ซึ่งตอบคำถามที่สองของฉัน:
เราขอแนะนำให้คุณไม่สร้างขั้นตอนการจัดเก็บใด ๆ โดยใช้ sp_ เป็นคำนำหน้า SQL Server ใช้คำนำหน้า sp_ เพื่อกำหนดขั้นตอนการจัดเก็บระบบ ชื่อที่คุณเลือกอาจขัดแย้งกับขั้นตอนของระบบในอนาคต [ ... ]
ไม่มีการกล่าวถึงสิ่งใดเกี่ยวกับปัญหาประสิทธิภาพที่เกิดจากการใช้ส่วนsp_
นำหน้า ฉันชอบที่จะรู้ว่ายังคงเป็นกรณีหรือว่าพวกเขาแก้ไขมันหลังจาก SQL Server 2000
sp_
? นี้เป็นเรื่องเกี่ยวกับประโยชน์เท่า prefixing tbl
ตารางที่มี เหตุใดจึงต้องทำให้ต้นแบบการค้นหาระบบเป็นอันดับแรก (แม้ว่าจะเล็กน้อยหรือไม่มีความแตกต่างด้านประสิทธิภาพ) เพื่อให้คุณสามารถใช้หลักการตั้งชื่อที่ไม่มีความหมายได้
dbo.sp_Author_Rename
dbo.Author_Rename
ฉันไม่สามารถนึกถึงสิ่งเดียวที่สมเหตุสมผล
sp_
เวอร์ชันที่สูงขึ้นเล็กน้อย(จำเป็นต้องตรวจสอบทั้งในฐานข้อมูลหลักและผู้ใช้เนื่องจากมันให้ความสำคัญกับระบบ procs ในmaster
-> procs procs ในmaster
)