Câu hỏi này xuất phát từ một người đồng nghiệp trên công ty của mình. Thật ra hỏi vậy xong bạn ấy trả lời luôn, rằng việc đặt tiền tố như vậy là không nên. Vì nó ảnh hưởng đến hiệu suất. Mình cũng khá bất ngờ nhưng sau một hồi chuyện trò, nghe các lý luận cũng như bằng chứng từ bạn ấy, mình đã tin hơn =))) Và đó là lý do mình viết post này.
Lý do đầu tiên là:
Trùng tên với sp hệ thống
Đây là đồ của Microsoft vậy câu hỏi đặt ra, tài liệu chính thức Microsoft có cái nào đề cập tới chuyện này không?
Câu trả lời là có.
Họ nói rất ngắn gọn, đại ý - đặt tên với prefix như rứa là không hiệu quả vì có thể gây ra nguy cơ trùng tên dẫn đến lỗi.
Avoid the use of the sp_ prefix when naming procedures. This prefix is used by SQL Server to designate system procedures. Using the prefix can cause application code to break if there is a system procedure with the same name. CREATE PROCEDURE (Transact-SQL) - Procedure Name.
Thật ra sp_
trong SQL Server nó còn mang nghĩa là system procedures, hoặc special procedures, đại ý chỉ rằng đây là các procedures đặc biệt của hệ thống, và khi đặt tên với tiền tố này, nghĩa là bạn đang gia tăng tỉ lệ đặt trùng tên với stored procedure đã có của hệ thống! Điều gì xảy ra khi bạn thật sự đặt tên trùng nhỉ?
Nghe cũng chưa căng lắm phải không, vậy cái lý do tiếp theo chắc chắn sẽ khiến nó căng tròn lên. Đó là lý do liên quan đến hiệu suất!
Ảnh hưởng tới hiệu suất
Vậy nếu bạn vẫn cố tình đặt tên sp với tiền tố trên thì như thế nào?
Giả sử bạn đã tạo một sp tên như sau: sp_mystoredprocedure
. Lúc bạn vừa execute sp này thì SQL Server sẽ nghĩ rằng, à nó mang tiền tố sp_
nghĩa là mình cần đi quét trong database master trước đã! Nhưng khi quét trong đó thì làm gì có một cái sp nào của hệ thống mang tên đó đâu! Chính vì vậy việc tiếp theo mà nó làm là mới đi tìm sp đó trong database của bạn. Bạn thấy vấn đề chưa?
Để mình liệt kê các bước nó theo top-down cho dễ nhìn nhé.
- Bạn execute sp.
- SQL server dừng xử lý trên database của bạn.
- Chuyển sang master database tìm.
- Tìm tìm sp trong master database.
- Không có, nên back lại database của bạn.
- À tìm thấy rồi, thì ra ở đây.
- Thực sự execute sp.
Nếu bạn nghĩ chừng đó step không đáng kể thì hãy nghĩ rằng, một dự án trong thực tế số lượng sp không phải ít, và cứ sp nào cũng đặt trên như vậy + thêm nhiều request truy vấn (hàng triệu request) thì sẽ như thế nào.
Trường hợp nào được xài?
Không phải hoàn toàn không được xài, mà sẽ có ngoại lệ, ví dụ khi bạn có một sp và nó giống nhau ở tất cả database, thì việc tạo một sp lặp đi lặp lại trên mỗi database khá mệt... Nên lúc này tạo sp này trong master database là điều dễ hơn, nên lúc này đặt tên có tiền tố như vậy là hợp lý.
Bonus bằng chứng
Vậy cái bằng chứng mà bạn mình show ở đâu? Thật ra chỉ cần search trên google là mình thấy cái vấn đề này đã được người ta bàn luận rồi, vấn đề chỉ là mình có để ý để đi tìm mấy vấn đề này không thôi!
Bài viết này ở đây Is the sp_ prefix still a no-no?. Một bài viết rất lâu đời từ năm 2012 và mình thấy nó vẫn còn hữu ích đến ngày nay.
Vậy đặt tên gì cho chuẩn?
Chúng ta có thể dùng cách đặt trên theo kiểu Verb_Object (như ngữ pháp tiếng anh ha). Ví dụ Find_PurchasedInvoice, Create_VipCustomer.
Bạn tham khảo thêm bài viết Naming Conventions for SQL Server Objects
Bài gốc
Mình viết lại chứ bài này mình viết trên blog của mình rồi, 5s quảng cáo (blo mình lâu rồi không viết) Zang hồ đồn không nên đặt tên Stored Procedure bắt đầu bằng tiền tố sp_ trong SQL Server?