Kĩ thuật “Quirky update”

Không biết có anh em nào đã nghe qua cái từ “quirky” chưa nhỉ :v Lần đầu mình nghe thì tưởng cái từ “kì quăc” viết ngược, ai ngờ sử dụng Guuuu gồ Tran sờ la te thì thấy nó dịch là ” Kì quặc” thế mới điêu =)) Chính vì vậy chủ đề hôm nay cũng nói về 1 kĩ thuật cũng khá là kì quặc được đặt tên dựa theo sự kì quặc của kĩ thuật nên được gọi là kĩ thuật kì quặc :v Vâng đó chính là “Quirky update”

Tối ưu SQL (phần 9): tính tổng các dòng ở trên

Anh em mở to mắt ra mà nhìn cái link bên trên mình để nhé. Nhìn đi nhìn kĩ vào. À tí quên nhớ click vào xem đấy không lại cứ ngồi ngó ngó không chả có tác dụng mẹ gì đâu :3 Bài viết nay mình nói để viết về việc tính toán trong Sql có sử dụng đến các giá trị từ dòng trước và dòng sau hay để tiếng Anh cho sang mọi thì cứ gọi là PrevValue và NextValue đi.

Đối với bài tính tổng từ các dòng trên thì đại ý nội dung trong bài là sử dụng kĩ thuật ROW_NUMBER để đánh số toàn bộ các bản ghi đã được ORDER BY theo 1 thứ tự nào đó và từ đấy thì khi đi qua từng dòng thì ta sẽ SUM toàn bộ cái cột đó với giá trị ROW_NUMBER đang tính sẽ lớn hơn các ROW_NUMBER trước thế là xong :3 Và hiện tại cái kĩ thuật này đang được mình sử dụng ở 1 số nơi trong cộng việc thấy gọi là dùng cũng ổn nên chưa ý kiến gì lắm.

Tuy vậy gần đây thì mình có đọc 1 bài viết nói về chủ đề PreValue và NextValue thì còn có 1 cách rất là hay đó là việc sử dụng UPDATE để tính toán các giá trị trước sau rồi gán cho cột. Đọc qua thì thấy cách này hiệu năng tốt vãi đái ra nên có thể suy nghĩ kết hợp cái này cũng với việc sử dụng OUTPUT để lấy ra kết quả nữa chứ thì thật là vi diệu. Anh em nào chưa đọc về OUTPUT thì lại chuột phải rồi New Tab cái link tại hạ để dưới đây nữa

Thiết kế hệ thống đặt vé xem phim (phần 2)

Kĩ thuật mà mình giới thiệu chính là “Quirky Update”. Ý tưởng của kĩ thuật là sẽ sử dụng 1 biến tạm được gọi là @variable đi. Chúng ta bắt đầu tiến hành UPDATE vào cái bảng dữ liệu cần tính toán tổng ở cái cột tên là COL_SUM đi như trong bài viết trên. Đoạn hấp dẫn nhất của nó chính là cái SET. Chúng ta sẽ SET giá trị của cái biến đó cho giá trị trong cột COL_SUM đi, rồi ta lại gán giá trị của cái cột COL_SUM đó bằng cái biến tạm cộng giá trị trong cột COL_SUM. Nhờ vậy mà qua mỗi dòng dữ liệu thì giá trị của cái biến cũng tăng mà thằng COL_SUM cũng tăng. Rất là kì quặc phải không :3

Đại ý là sẽ viết là

UPDATE T

SET @variable = COL_SUM = COL_SUM + @variable

Nhìn hơi lạ phải không anh em :)) Ứng dụng cùng với cái OUTPUT để in ra tổng qua mỗi lần cộng nữa sẽ rất là nhanh mà chả phải động tay động chân thêm cái câu SELECT nào nữa cơ

UPDATE T

SET @variable = COL_SUM = COL_SUM + @variable

OUPUT Inserted.COL_SUM

Quả là vi diệu phải không :v Với cái kĩ thuật kì quặc này thì anh em ta có thể dễ dàng sử dụng giá trị từ dòng dữ liệu trước (à cái bảng T như trên nhớ là phải được order ví như trên cái cột CREATED_DATE rồi đấy nhé :3) thông qua biến @varible. Vâng giờ hãy ghi nhớ cái “QUIRKY UPDATE” trong lòng đi nhé :v Hãy nhớ đến em nó mỗi khi cần :v

PS: hiện tại thì SQL có hỗ trợ thêm cái hàm gọi là SUM() OVER() để tính toán kiểu như trên rồi nhé. Anh em đỡ phải khổ tâm suy nghĩ nữa. Tuy vậy hiệu năng chưa được kiểm chứng so với “Quirky Update” lắm nên anh em nào có thể rảnh rỗi tự đo rồi báo cho mình cập nhật kế quả nhé :v

Cách dùng thì cũng đơn giản thôi

SELECT SUM(COL_SUM) OVER (ORDER BY CREATED_DATE) FROM T

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

Create a free website or blog at WordPress.com.

Up ↑

%d bloggers like this: