So sánh code SQL trên store procedure và code trên tầng application

Store procedure là gì:

Stored procedure được định nghĩa như một tập các khai báo sql được lưu trữ ngay trong cơ sở dữ liệu (database) và sau đó, được triệu gọi bởi một program, một trigger hay thậm chí là một stored procedure khác.

**Các ưu điểm của việc sử dụng store procedure **

  1. Performance: sử dụng store procedure sẽ mang lại các lợi ích sau: 1.1 Pre-parsed SQL: stored procedure sẽ được biên dịch (compile) và lưu trữ ngay trong database. -> nó sẽ chạy nhanh hơn là một lệnh sqlđược gởi trực tiếp từ ứng dụng. 1.2 Pre-generated query execution plan: Với những câu truy vấn SQL phức tạp, cần join nhiều bảng, thời gian tạo ra bản kế hoạch để tối ưu hóa các bước truy vấn không phải là ngắn. Các thủ tục thường sẽ được sử dụng lại bước tối ưu query. 1.3 Giảm được chi phí fetch data từ các các query trả về khi chúng ta cần thực hiện 1 tập các câu query mà câu query sau cần sử dụng lại kết quả của query trước. 1.4 Việc sử dụng store procedure, view và function sẽ giúp chúng ta sử dụng một cách hiệu quả kết quả được cache trong database. Ví dụ như câu query sau: select * from student join ... order by name limit 5; Việc sử dụng view sẽ giúp chúng ta thực hiện được việc join các table 1 lần, lúc này ta cần lưu ý đến việc bỏ qua việc order và limit vì có một số trường hợp, chúng ta sẽ vẫn sử dụng lại kết quả của câu query trên, nhưng với điều kiện order và where khác đi.

  2. Sercurity: 2.1 SQL injection attacks, viết code trên application code, không cẩn thận có thể dính Sql injection. 2.2 User Permissions, sử dụng store procedure, chúng ta có thể giới hạn quyền của user chỉ được call procedure mà thôi -> sẽ tránh được việc phân quyền cho user chạy được mọi thứ trên database.

  3. Maintain: dùng store procedure tách code SQL ra khỏi chương trình, sẽ giúp ta tách biệt được ứng dụng và database, che dấu toàn bộ cấu trúc database khỏi ứng dụng. Ta không cần biết ở trên tầng ứng dụng các thông tin như database được tổ chức như thế nào, các bảng nào được link với nhau. -> có thể dễ dàng thay đổi cấu trúc của database khi cần và sửa lại các thủ tục có liên quan mà không ảnh hưởng gì đến ứng dụng.

Ưu điểm của việc code SQL trực tiếp trên code ứng dụng

  1. Dễ implement các chức năng có logic phức tạp hơn. Với code java, C# v.v... chúng ta có các library hỗ trợ thao tác sử lý logic tốt hơn sql.
  2. Dễ Debug hơn, mặc dù chúng ta có thể debug store procedure bằng việc check log hoặc print message, nhưng về cơ bản trên store procedure việc debug không thuận tiện bằng trên code ứng dụng.
  3. Stored procedure làm cho database server phải tốn nhiều tài nguyên hơn, trong khi tài nguyên này lại cần được tập trung cho việc sử lý lưu trữ và nhận dữ liệu.
  4. Việc viết store procedure đòi hỏi kĩ năng về SQL cao hơn -> đôi khi Dev viết store procedure kết quả ko tốt bằng code trên tầng ứng dụng. -> Viết SQL trên ứng dụng sẽ giúp tránh được việc phải switch qua lại giữa code ứng dụng và code SQL.
  5. Quản lý source code, logic trên tầng ứng dụng tốt hơn trên store procedure. Mặc dù store procedure cũng có thể chia nhỏ logic ra thành các sub store procedure, nhưng database không support tạo các package như trên tầng ứng dụng -> việc quản lý và tìm kiếm source code trên database không tốt bằng trên ứng dụng.

**Tổng kết lại **

Stored Procedure có những thuận tiện cũng như bất lợi như trên -> Khi phát triển ứng dụng, ta cần đánh giá những gì chúng ta cần, nếu cần phát triển nhanh, không có người có kinh nghiệm về sql hoặc không nắm chắc về store procedure, database hiện sử dụng thì viết code SQL trên application sẽ là lựa chọn đơn giản hơn. Còn trong những vấn đề cần truy vấn và lưu trữ vs data nhiều, đòi hỏi performance tốt thì chúng ta lên cân nhắc sử dụng store procedure để tận dụng hết thế mạnh của database.