Một trong những đồng nghiệp của tôi đã đặt tên một thủ tục được lưu trữ trong cơ sở dữ liệu SQL Server 2008 R2 của chúng tôi sp_something
. Khi nhìn thấy điều này, tôi nghĩ ngay: "Đó là SAI!" và bắt đầu tìm kiếm dấu trang của tôi cho bài viết trực tuyến này giải thích tại sao nó sai, vì vậy tôi có thể cung cấp cho đồng nghiệp của mình một lời giải thích.
Trong bài viết (của Brian Moran ), người ta giải thích rằng việc cung cấp cho thủ tục được lưu trữ một tiền tố sp_ làm cho SQL Server xem xét cơ sở dữ liệu chính cho một kế hoạch được biên dịch. Vì sp_sproc
không nằm trong đó, SQL Server sẽ biên dịch lại thủ tục (và cần một khóa biên dịch độc quyền cho điều đó, gây ra các vấn đề về hiệu năng).
Ví dụ sau đây được đưa ra trong bài viết để chỉ ra sự khác biệt giữa hai thủ tục:
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
Bạn chạy cái này, sau đó mở Profiler (thêm Thủ tục lưu trữ -> SP:CacheMiss
sự kiện) và chạy lại các thủ tục được lưu trữ. Bạn phải thấy sự khác biệt giữa hai thủ tục được lưu trữ: thủ tục sp_Select1
được lưu trữ sẽ tạo ra một SP:CacheMiss
sự kiện nhiều hơn Select1
thủ tục được lưu trữ (bài viết tham khảo SQL Server 7.0 và SQL Server 2000. )
Khi tôi chạy ví dụ trong môi trường SQL Server 2008 R2, tôi nhận được cùng một lượng SP:CacheMiss
sự kiện cho cả hai thủ tục (cả trong tempdb và trong cơ sở dữ liệu thử nghiệm khác).
Vì vậy, tôi tự hỏi:
- Tôi có thể làm điều gì sai trong việc thực hiện ví dụ này không?
sproc sp_something
Adagium ' không đặt tên người dùng vẫn còn hiệu lực trong các phiên bản SQL Server mới hơn phải không?- Nếu vậy, có một ví dụ hay cho thấy tính hợp lệ của nó trong SQL Server 2008 R2 không?
Cảm ơn rất nhiều cho những suy nghĩ của bạn về điều này!
CHỈNH SỬA
Tôi đã tìm thấy Tạo thủ tục lưu trữ (Công cụ cơ sở dữ liệu) trên msDN cho SQL Server 2008 R2, câu trả lời cho câu hỏi thứ hai của tôi:
Chúng tôi khuyên bạn không nên tạo bất kỳ thủ tục được lưu trữ nào bằng cách sử dụng sp_ làm tiền tố. SQL Server sử dụng tiền tố sp_ để chỉ định các thủ tục lưu trữ hệ thống. Tên bạn chọn có thể xung đột với một số thủ tục hệ thống trong tương lai. [...]
Không có gì được đề cập ở đó về các vấn đề hiệu suất gây ra bằng cách sử dụng sp_
tiền tố mặc dù. Tôi muốn biết liệu đó vẫn là trường hợp hay họ đã sửa nó sau SQL Server 2000.
sp_
? Điều này cũng hữu ích như tiền tố một bảng với tbl
. Tại sao phải làm chủ hệ thống tìm kiếm trước (ngay cả khi nó không đáng kể hoặc không có hiệu suất khác biệt) để cho phép bạn sử dụng quy ước đặt tên vô nghĩa này?
dbo.sp_Author_Rename
tốt hơn dbo.Author_Rename
. Tôi không thể nghĩ về một điều duy nhất có ý nghĩa.
sp_
phiên bản lớn hơn một chút (cần kiểm tra cả cơ sở dữ liệu chính và cơ sở dữ liệu vì nó ưu tiên hệ thống trongmaster
-> procs trong người dùng DB -> không phải hệ thống procs inmaster
)