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

Tiếp tục series sau 2 bài

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

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

Đối với CSDL Sql thì những cuộc cãi vã giữa 2 cái Exists và IN thì thôi rồi nhiều khỏi nói luôn. Lên google mà search thì chắc chỉ ra được tầm vài triệu kết quả là cùng, cũng không nhiều lắm nhỉ

untitled

Nay các hạ cũng có đôi lời nói về 2 người tình không bao giờ cưới này và 1 kẻ thứ ba xuất hiện mà tác dụng cũng lơ lớ đó là chị JOIN để muốn nhấn mạnh vấn đề hiệu năng khi các huynh đệ chúng ta sử dụng 3 thằng này.

1

Đầu tiên thì mình muốn nhắc lại về 2 chàng trai của chúng ta EXISTS và IN

Sự xuất hiện của chàng trai EXISTS  luôn có mục đích là để hạn chế việc sử dụng COUNT.

–Câu này sẽ kiểm tra dữ liệu trên toàn chốn TABLE

select count(*) from [table] where …

–Câu này trả lại giá trị true nếu như gặp chàng trai phù hợp ngay lập tức

exists ( select * from [table] where … )

Còn anh IN thì luôn được sử dụng khi cần lấy dữ liệu tĩnh

select * from [table]  where [field] in (1, 2, 3)

Đối với JOIN thì thực ra cũng không khác mấy khi sử dụng.

Ví như bây giờ chúng ta có 2 bảng là A và B có liên kết với nhau thông qua khóa là cột ID; và muốn lấy mọi thứ từ bảng A với 1 điều kiện từ bảng B thì ta sử dụng JOIN

SELECT  A.*
FROM    tableA AS A
JOIN    tableB AS B
    ON  A.id = B.id
WHERE   [condition];

Ta cũng có thể viết với EXISTS và IN trong trường hợp này như sau

--IN
SELECT  *
FROM    tableA
WHERE   tableA.id IN (SELECT tableB.id FROM tableB WHERE [condition]);
-- EXISTS
SELECT  *
FROM    tableA
WHERE   EXISTS (SELECT 1 FROM tableB WHERE [condition] AND tableA.id = tableB.id);

Thật là vi diệu phải không!!! Kết quả không hề thay đổi chút nào :3

tonyteo-162920052923-that-la-vi-deo

Trong hầu hết các trường hợp khi sử dụng thì EXISTS và JOIN luôn hiệu quả và nhanh hơn rất nhiều so với IN. Giờ thì chúng ta hãy đi tìm lời giải cho lý do vì sao của chuyện này.

16-see-through-toilet-why-funny

Đơn giản khi chúng ta sử dụng IN kết hợp cùng 1 câu subquery thì CSDL phải xử lý toàn bộ cái đống dữ liệu ở câu subquery đầu tiên, sau đó thì thực thi toàn bộ câu quer y để đi tìm các mối liên hệ (relationship) giữa cả 1 đống lộn nhộn dữ liệu từ 2 thằng dựa trên IN (quá trình matching)

funny-relationship-stages-boy-girl-hands

Còn với EXISTS hay JOIN thì CSDL đơn giản chỉ là trả lại kết quả true/false khi kiểm tra mối quan hệ đó có hay không. Rất là nhẹ nhàng.

Nếu cái bảng nằm trong subquery mà nó thật nhỏ bé như cô nàng nóng bỏng trong bức hình dưới thì thôi nhé, không cần phải bàn luận gì về hiệu năng của EXISTS và JOIN với IN nữa đâu.

img372727751

Ngồi viết SQL với JOIN thì có thể giúp anh em ta lấy thêm được 1 mả dữ liệu nữa nếu mà thích (mình thích thì mình lấy thôi :3) Nói vậy thôi chứ nếu không có nhu cầu lấy thêm cột nào thì anh em không lấy nhé vì lấy thêm thằng nào thì CPU mệt thêm thằng đó, vất vả lắm 😦 lại ảnh hưởng đến hiệu năng đó :3

3300457647_110ffe92ef

Với mấy cái nho nhỏ mà mình trình bày trên thì anh em rà soát lại xem đống code mình viết có nhiều cái IN hay không, nếu có thì hãy thử đo lại hiệu năng của những câu truy vấn đó khi sử dụng với EXISTS và JOIN để kiểm tra nhé.

Thôi đấy, hết rồi đấy. Bye :v

funny-animal-bye-bye

Advertisements

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

  1. Pingback: Tối ưu SQL (phần 9): tính tổng các dòng | Code, code and more code

  2. Pingback: Tối ưu SQL phần 8: 1 câu chuyện đơn gian về việc cộng chuỗi | Code, code and more code

  3. Pingback: Tối ưu SQL (phần 7): Chuyện ngắn của ID | Code, code and more code

  4. Pingback: Tối ưu hiệu năng SQL (phần ): Update hay Merge? | Code, code and more code

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 )

Twitter picture

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

Facebook photo

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

Google+ photo

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

Connecting to %s