23/05/2024
𝐓𝐚̣𝐢 𝐬𝐚𝐨 𝐤𝐡𝐢 𝐣𝐨𝐢𝐧 𝟏 𝐛𝐚̉𝐧𝐠 𝐯𝐨̛́𝐢 𝐝𝐮̛̃ 𝐥𝐢𝐞̣̂𝐮 𝐥𝐨̛́𝐧 𝐡𝐨̛𝐧 𝟏 𝐛𝐚̉𝐧𝐠 𝐯𝐨̛́𝐢 𝐝𝐮̛̃ 𝐥𝐢𝐞̣̂𝐮 𝐧𝐡𝐨̉ 𝐡𝐨̛𝐧 𝐦𝐚̀ 𝐣𝐨𝐢𝐧 𝐛𝐚̉𝐧𝐠 𝐝𝐮̛̃ 𝐥𝐢𝐞̣̂𝐮 𝐥𝐨̛́𝐧 𝐡𝐨̛𝐧 𝐭𝐫𝐮̛𝐨̛́𝐜 𝐭𝐡𝐢̀ 𝐜𝐚̂𝐮 𝐥𝐞̣̂𝐧𝐡 𝐭𝐫𝐮𝐲 𝐯𝐚̂́𝐧 𝐥𝐚̣𝐢 𝐧𝐡𝐚𝐧𝐡 𝐡𝐨̛𝐧
Khi thực hiện một truy vấn SQL với phép JOIN, việc sắp xếp thứ tự các bảng trong phép JOIN có thể ảnh hưởng đến hiệu suất của truy vấn. Đặc biệt, nếu bạn tham gia một bảng lớn với một bảng nhỏ, việc đặt bảng lớn trước trong phép JOIN có thể cải thiện hiệu suất truy vấn vì những lý do sau:
𝟏. 𝐓𝐡𝐮̛́ 𝐭𝐮̛̣ 𝐱𝐮̛̉ 𝐥𝐲́ 𝐯𝐚̀ 𝐭𝐨̂́𝐢 𝐮̛𝐮 𝐡𝐨́𝐚: Các hệ quản trị cơ sở dữ liệu (DBMS) thường sử dụng các thuật toán và chiến lược tối ưu hóa để thực hiện các phép JOIN. Một trong các chiến lược phổ biến là Nested Loop Join. Trong thuật toán này, bảng bên ngoài (outer table) được quét trước, và cho mỗi hàng trong bảng bên ngoài, hệ thống sẽ tìm kiếm các hàng tương ứng trong bảng bên trong (inner table). Nếu bảng lớn được quét trước, số lượng các phép tìm kiếm trong bảng nhỏ hơn sẽ ít hơn và nhanh hơn.
𝟐. 𝐒𝐮̛̉ 𝐝𝐮̣𝐧𝐠 𝐛𝐨̣̂ 𝐧𝐡𝐨̛́ 𝐡𝐢𝐞̣̂𝐮 𝐪𝐮𝐚̉ 𝐡𝐨̛𝐧: Khi bảng nhỏ được quét trước (được lưu trong bộ nhớ tạm thời), và bảng lớn hơn được quét sau, toàn bộ bảng nhỏ có thể được lưu trữ trong bộ nhớ để sử dụng cho mỗi lần quét của bảng lớn. Điều này giảm thiểu số lượng lần truy cập đến dữ liệu trên đĩa, cải thiện tốc độ truy vấn.
𝟑. 𝐏𝐚𝐫𝐭𝐢𝐭𝐢𝐨𝐧𝐬 𝐯𝐚̀ 𝐈𝐧𝐝𝐞𝐱𝐞𝐬: Khi bảng lớn được tham gia trước, cơ sở dữ liệu có thể sử dụng các chỉ số (indexes) và phân vùng (partitions) hiệu quả hơn để tìm kiếm các hàng tương ứng trong bảng nhỏ, giúp cải thiện hiệu suất truy vấn.
𝟒. 𝐂𝐚𝐜𝐡𝐢𝐧𝐠: Khi bảng lớn được quét trước, kết quả của bảng lớn có thể được lưu vào bộ nhớ cache, giúp các truy vấn kế tiếp trở nên nhanh hơn nếu có các phép JOIN khác sử dụng cùng bảng này.
𝟓. 𝐁𝐨̣̂ đ𝐞̣̂𝐦 đ𝐢̃𝐚 (𝐃𝐢𝐬𝐤 𝐈/𝐎): Khi xử lý bảng lớn trước, hệ thống có thể tối ưu hóa bộ đệm đĩa, giảm thiểu số lần đọc/ghi đĩa không cần thiết, từ đó tăng tốc độ truy vấn.
Ví dụ cụ thể:
Giả sử bạn có hai bảng, A và B, trong đó bảng A rất lớn và bảng B nhỏ. Nếu bạn viết truy vấn như sau:
SELECT *
FROM A
JOIN B ON A.id = B.id;
Hệ quản trị cơ sở dữ liệu sẽ quét qua tất cả các hàng của bảng A (bảng lớn) trước và sau đó tìm kiếm các hàng tương ứng trong bảng B (bảng nhỏ). Việc tìm kiếm trong bảng nhỏ hơn sẽ nhanh hơn do số lượng hàng cần tìm kiếm ít hơn và dữ liệu có thể nằm gọn trong bộ nhớ.
Trong trường hợp ngược lại, nếu bảng nhỏ được quét trước và mỗi hàng của nó được sử dụng để tìm kiếm trong bảng lớn, hệ quản trị cơ sở dữ liệu sẽ phải thực hiện nhiều phép tìm kiếm hơn trên bảng lớn, dẫn đến truy vấn chậm hơn.
Tuy nhiên, cần lưu ý rằng các hệ quản trị cơ sở dữ liệu hiện đại đều có các cơ chế tối ưu hóa phức tạp và có thể tự động chọn thứ tự JOIN tốt nhất. Việc tối ưu hóa thủ công thường chỉ cần thiết trong các trường hợp đặc biệt khi hệ thống không đưa ra được lựa chọn tối ưu nhất.