Tối ưu hiệu năng SQL (phần 6): Update hay Merge?

Tối ưu hiệu năng SQL (phần 1): DATETIME

Tối ưu hiệu năng SQL (phần 2): DELETE

Tối ưu hiệu năng SQL (phần 3): Exists, IN và người thứ ba

Tối ưu hiệu năng SQL (phần 4): Trigger

Tối ưu hiệu năng SQL phần 5: RANDOM

Tối ưu SQL (phần 7): Chuyện ngắn của ID

Bỏ bê cái series này xem ra cũng đã được 1 thời gian lâu lâu rồi, nay nhân dịp kỉ niệm ngày hậu lễ Va lên thai, mình tiếp tục đẻ ngay 1 bài viết để hưởng ứng phong trào với chủ đề “Nơi nào có em” dựa theo bài mới nhất của Sếp Tùng

Đây có lẽ là câu chuyện tình buồn của mình và Sql năm xưa. Ngày đó 5 năm trước, khi mình bước những bước chân đầu tiên trên con đường ma giáo của giới code cỏ thì người con gái đầu tiên mình gặp đó chính là cô nàng Sql. Nàng nhẹ nhàng mà nồng cháy, đã làm cho mình vẫn si mê nàng đến tận giờ, khi ở bên nàng mình thực sự có thể giải quyết được hầu hết các bài toán hóc búa do những tên ma đầu ở công ty giao cho :v Hiện tại thì giờ mình cũng không còn được gặp nàng ấy nhiều nữa nhưng mà mối lương duyên của mình với nàng vẫn rất là sâu đậm :3 Giờ mỗi khi có dự án thì mình chỉ dám lén lút quan hệ với nàng ấy thông qua những ng đưa tin là các ORM :3 Thông qua các ORM này thì những bài toán đơn giản không cần nàng ấy phải nhúng tay vào nữa mà đích thân mình đã có thể xử lý được. Giới thiệu với anh em 1 vài ORM để cũng nhau sánh bước trong ngày lễ tình yêu này như EntityFramework, Dapper, NHibernate, LinqToSql..

sql_shaded_banner_withtext

Thôi câu chuyện buồn đó đã qua rồi nay chỉ vì 1 ngày lễ mà khơi gợi lại thôi. Mục đích sâu sa của bài viết hôm nay để giới thiệu về cái câu lệnh khá là quen thuộc đối với anh em làm Sql đó là UPDATEMERGE.

Nói về 2 thằng này thì cũng có lẽ là không có nhiều thứ để nói, chúng thiết kế với ý nghĩa cao cả là sử dụng để cập nhật dữ liệu rồi. Trong bài viết này mình không muốn nói đến cái câu lệnh cơ bản UPDATE SET WHERE bình thường nhé :)) vì cái này nó đơn giản quá ấy mà. Cái thực sự được nói đến với UPDATE trong đây là UPDATE với JOIN vì như thế so sánh với MERGE nó đúng hơn :3

update-merge-in-hibernate

Khi sử dụng UPDATE thì bản chất chỉ là cập nhật dữ liệu nhưng khi sử dụng MERGE thì anh em ta có thể làm đủ mọi thứ một lúc từ INSERT đến UPDATE hay DELETE chỉ trong 1 command thôi. Chính vì thế MERGE sinh ra để xử lý với các trường hợp matching. Tuy vậy dùng MERGE sẽ đẻ ra các câu lệnh nhìn khá là phức tạp và chưa chắc hiệu năng đã tốt nên khuyến cáo thực ra là vẫn nên sử dụng UPDATE :v

Đây là code mẫu sử dụng MERGE để vừa INSERT, UPDATE lẫn DELETE

MERGE Target T
USING Source S
ON (S.ID = T.ID)
WHEN MATCHED
THEN UPDATE
     SET T.Name = S.Name,
         T.Code = S.Code
WHEN NOT MATCHED BY TARGET
THEN INSERT (ID, Name, Code)
     VALUES (S.ID, S.Name, S.Code)
WHEN NOT MATCHED BY SOURCE
THEN DELETE;

Nếu sử dụng UPDATE thì anh em chỉ cập nhật được thôi chứ không thể dùng được hổ lốn như vậy ví như

UPDATE Target
     SET Name = S.Name,
         Code = S.Code,
FROM Target T
JOIN Source S ON T.ID = S.ID

Chính vì vậy người ta hay sử dụng MERGE khi cần đồng bộ dữ liệu từ chỗ này qua chỗ kia, từ chỗ kia qua chỗ này vì so với việc sử dụng UPDATE thì rõ ràng đọc cái MERGE dễ hiểu hơn với việc MATCH hay không MATCH. Chứ đọc cái câu UPDATE cùng JOIN kia thì khó nghĩ quá :((

Tuy vậy như đã nói ở trên thì thực sự MERGE dễ đọc nhưng có thể gây lên các vấn đề hiệu năng khó kiểm soát do câu lệnh thì nó phức tạp hơn. Do đó anh em khi sử dụng mà thực hiện với nhiều loại thì hãy dùng MERGE còn không hay dùng UPDATE thôi nhé :3

Anh em có thể đọc qua các bài viết cũ trong series này để trở thành rockstar SQL nào

Tối ưu hiệu năng SQL (phần 1): DATETIME

Tối ưu hiệu năng SQL (phần 2): DELETE

Tối ưu hiệu năng SQL (phần 3): Exists, IN và người thứ ba

Tối ưu hiệu năng SQL (phần 4): Trigger

Tối ưu hiệu năng SQL phần 5: RANDOM

sql_rockstar-jan2012

Leave a comment

Create a free website or blog at WordPress.com.

Up ↑