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..
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à UPDATE và MERGE.
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
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
Thanks
LikeLike