dynamic-sql-la-gi-static-sql-la-gi

Dynamic SQL và Static SQL – những điều cần biết

DB

Static SQL là gì?. Dynamic SQL là gì?. Nguồn gốc ra đời thật là một câu chuyện dài.

Anh em chúng ta ngày xưa xem phim chưởng Hongkong tất nhiên không thể không biết tới Trương Vô Kị, Tạ Tốn và BIG DICK môn phái. Ý nhầm (BIG SIX môn phái).

Ngày ấy, lúc Triệu Mẫn thách đấu Trương Tam Phong, trong lúc nguy khốn, Vô Kỵ được sư ông chỉ dạy cho một bộ quyền pháp có tên “Thái cực quyền”. Bộ võ học tuyệt tác này có đoạn viết:

Thái cực quyền trọng kì nghĩa, bất trọng kì chiêu.

Lấy TĨNH CHẾ ĐỘNG, lấy âm chế dương, lấy vô chiêu thắng hữu chiêu.

Tại sao tôi lại nhắc về thái cực quyền, vì bản thân cái Dynamic đã có nghĩa là động. Dynamic SQL là SQL động. Nhưng để hiểu được động thì tất nhiên phải biết một chút tới tĩnh.

Đm, thằng quỷ viết bài này!. Nói té đi là Dynamic, dẫn chuyện dài dòng. Bày đặt Thái Cực Quyền các kiểu, bố m vả cái lại chả răng rụng dynamic bây giờ.

Ấy chết, anh đừng nóng, viết vậy là vì sợ một số anh em chỉ chăm chăm vào Dynamic SQL mà quên vẫn còn SQL tĩnh sừng sững xưa giờ đó. Bắt đầu ngay đây!

1 SQL tĩnh – Static SQL – Minh giáo

Đầu tiên, định nghĩa rõ ràng của Static SQL:

Static or Embedded SQL are SQL statements in an application that do not change at runtime , therefore, can be hard-coded into the application

SQL tĩnh là các câu SQL trong application, không thể thay đổi lúc thực thi. Do đó, có thể set cứng các câu SQL trong ứng dụng

1.1 Điểm mạnh

Tất nhiên, SQL Tĩnh (Static SQL) không phải là không có lợi thế của nó. Các ứng dụng (application) sử dụng Static SQL sẽ có hiệu năng tốt hơn so với Dynamic SQL

Dynamic statements there’s no need for pre-compilation or re-building as long as the access plans are generated at run-time

SQL tĩnh luôn được compile lúc compile time. Chính vì thế, sử dụng SQL tĩnh giúp hạn chế được số lần compile SQL khi sử dụng.

// Một câu SQL như thế này có thể xem là ví dụ hay cho Static
// Sẽ được compile lúc compile time
// Không có điều kiện nào làm SQL thay đổi
SELECT
  id, first_name, last_name
FROM
  customers;

1.2 Điểm yếu

Tuy nhiên, compile một lần cũng có điểm không tốt. Trường hợp SQL search với các điều kiện search là flexible, sẽ phải viết rất nhiều câu SQL cho từng điều kiện search khác nhau. Rõ ràng là cực kì vất vả (đôi khi là không thể thực hiện được)

Ví dụ, như trường hợp sử dụng BackLog (vô cùng quen thuộc với tầng lớp SE). Backlog có một phần tính năng search tên là Advanced Search.

static-sql-la-gi-dynamic-sql-la-gi
Backlog cho phép custom các field muốn tìm kiếm. Các điều kiện search có thể matching với nhau.
Nguồn/Source: backlog.com

Có thể thấy là advanced search có tới 10 field có thể custom, không thể biết được người sử dụng sẽ chọn tìm kiếm theo bao nhiêu field.

Lúc này Static SQL chỉ như Minh giáo, phát triển nhanh, nhiều giáo đồ sẵn sàng chết để hộ giáo, nhưng lại không thể thay đổi linh hoạt như các môn phái khác trong võ lâm.

Thật sự rất khó để viết SQL tĩnh, lúc này SQL động (lục đại môn phái) sẽ ra tay.

2. SQL động – Dynamic SQL – Lục đại môn phái

Dynamic SQL is SQL statements that are constructed at runtime; for example, the application may allow users to enter their own queries.

SQL động là những câu SQL có thể được xây dựng trong khi chương trình thực thi. Ví dụ thường thấy ở đây là ứng dụng có thể chấp nhận cho người dùng nhập những câu Query mà họ muốn

2.1 Điểm mạnh

Dynamic SQL thật sự mang tới cái động như tên của nó. Trường hợp ứng dụng cần thay đổi logic, hay các điều kiện tìm kiếm được người dùng thay đổi liên tục. Dynamic SQL tỏ ra vượt trội hơn hẳn so với Static.

Ví dụ dưới đây cho thấy sự linh hoạt của SQL động khi có nhiều điều kiện search muốn match với nhau. Trên thực tế, có thể còn phức tạp hơn, bao gồm các điều kiện search IN, OR, AND, LIKE, …

// Một câu SQL như thế này có thể xem là ví dụ hay cho Dynamic
// Sẽ được compile lúc run time
// Thực tế có thể có nhiều condition phức tạp hơn - ví dụ bằng Mybatis
SELECT
  id
  , first_name
  , last_name 
FROM
  customers cus 
WHERE 
 cus.id = 1
 // Nếu có nhập tuổi - search theo tuổi
 <if test="userCondition.age != null">
   AND cus.age = request.age
 </if>
 // Nếu có nhập địa chỉ - And thêm điều kiện này
 <if test="userCondition.address != null">
   AND cus.address = request.address
 </if>
 <if test="userCondition.phone != null">
   AND cus.phone = request.phone
 </if>

Dynamic SQL has only one advantage over static statements which can be clearly noticed once the application is edited or upgraded, so with Dynamic statements there’s no need for pre-compilation or re-building as long as the access plans are generated at run-time,

SQL động rõ ràng có lợi thế rõ rệt so với Static trong trường hợp ứng dụng sửa đổi hoặc cập nhật, Dynamic không cần phải compilation hoặc re-building lại lúc khởi chạy.

2.2 Điểm yếu

Về tốc độ, SQL động rõ ràng không thể so với SQL tĩnh (It is less swift and efficient – không nhanh chóng bằng)

Thực tế làm việc của mình với Dynamic SQL (Dự án gần đây nhất là MyBatis – các bạn có thể đọc bài về Mybatis tại đây), một số câu SQL động vô cùng phức tạp.

Mặc dù linh động để thêm, xóa điều kiện, nhưng trường hợp người viết và người maintainance khác nhau. Thực sự thì we are in a big fu**ing trouble. Khá là khỏ để hiểu, rồi đi fix bug hay gì gì đó.

3. Sự khác biệt

Static SQLDynamic SQL
Không thể thay đổi lúc runtime, gần giống như hard coded.
Không thể uyển chuyển như Dynamic SQL
Một số condition trong SQL tĩnh không thể thực hiện được như Static SQL
Performance tốt do đã được biên dịch trước lúc runtimePerformance kém hơn so với Static SQL do tạo các câu SQL trong lúc runtime
Trường hợp có nhiều điều kiện thay đổi có thể tạo ra nhiều câu SQL khác nhau. Sẽ phải viết rất nhiêu câuTrường hợp có nhiều điều kiện tạo ra các câu SQL khác nhau, SQL viết kiểu này sẽ không được clear cho lắm

4. Tham khảo

Lúc cần tham khảo hoặc research, cần lưu ý các tên gọi khác của Static và Dynamic SQL. Static còn được gọi là EMBEDDED SQL. Dynamic còn có tên gọi khác là INTERACTIVE SQL.

Để tìm kiếm thêm thông tin, các vị bằng hữu trong giang hồ có thể tham khảo:

Có gì thắc mắc cứ comment đây nha! - Please feel free to comment here!
Chia sẻ bài viết


Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *