Zang hồ đồn không nên đặt tên Stored Procedure bắt đầu bằng tiền tố sp_ trong SQL Server?

Trên giới giang hồ có một tin đồn rằng khi tạo Stored Procedure không nên đặt tên bắt đầu bằng tiền tố (prefix) sp_. Vậy tin đồn đó có phải là thật, chúng ta cùng đi tìm hiểu nhé. À tin đồn này chỉ quan trọng với hệ người đặt tên gì cũng phải có tiền tố phía trước, còn ai không thích rứa thì tin đồn này vô tác dụng.

Trùng tên với sp hệ thống

Ông bà có câu: “nói có docs, mách có example” (à ông bà không nói rứa, mình nói rứa) - ý là mấy cái tin đồn thì cần có docs chứng minh - docs là documents á. Vậy 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.

Ơ documents gì mà ghi lý do chưa thuyết phục cho lắm. Chắc gì tôi đã đặt tên trùng và rõ ràng tôi đã thêm tiền tố sp_, nó nghĩa là stored procedure (mình viết tắt là sp nha) rồi còn gì.

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é.

  1. Bạn execute sp.
  2. SQL server dừng xử lý trên database của bạn.
  3. Chuyển sang master database tìm.
  4. Tìm tìm sp trong master database.
  5. Không có, nên back lại database của bạn.
  6. À tìm thấy rồi, thì ra ở đây.
  7. 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ý.

Hi vọng cái post này sẽ giúp database của mình chạy nhanh hơn :3

Mách có example đâu?

Example + bài benmark test bạn tham khảo ở đâ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

Tóm lại

Có thể trong tương lai cái cách truy quét sp với tiền tố sp_ sẽ thay đổi hoặc không còn đúng. Nhưng tới hiện tại, nếu check trong master databse, thì sp với tiền tố sp_ vẫn đang được sử dụng. Nên tốt nhất nên đừng đặt tên như rứa trừ khi thật sự cần.

Ngoài sp_ ra, vẫn còn cái khác ví dụ xp_ (extended procedures). Và nó cũng tương tự sp_.

Tham khảo

 Comments
Comment plugin failed to load
Loading comment plugin