Hãy xem xét một ví dụ: bảng có bản ghi hóa đơn và bảng có liên quan với bản ghi chi tiết đơn hàng hóa đơn. Hãy xem xét mã giả của khách hàng:
for each (invoice in invoices)
let invoiceLines = FindLinesFor(invoice)
...
Nếu bạn có 100.000 hóa đơn với 10 dòng mỗi mã, mã này sẽ tra cứu 10 dòng hóa đơn từ bảng 1 triệu và nó sẽ thực hiện 100.000 lần. Khi kích thước bảng tăng lên, số lượng thao tác chọn sẽ tăng lên, và chi phí của mỗi thao tác chọn sẽ tăng.
Trở thành máy tính nhanh, bạn có thể không nhận thấy sự khác biệt về hiệu suất giữa hai cách tiếp cận nếu bạn có vài nghìn bản ghi hoặc ít hơn. Bởi vì chi phí tăng nhiều hơn tuyến tính, khi số lượng hồ sơ tăng (lên tới hàng triệu, giả sử), bạn sẽ bắt đầu nhận thấy sự khác biệt và sự khác biệt sẽ trở nên khó chấp nhận hơn khi kích thước của tập dữ liệu tăng lên.
Việc tham gia, tuy nhiên. sẽ sử dụng các chỉ mục của bảng và hợp nhất hai tập dữ liệu. Điều này có nghĩa là bạn đang quét bảng thứ hai một cách hiệu quả thay vì truy cập ngẫu nhiên N lần. Nếu có khóa ngoại được xác định, cơ sở dữ liệu đã có các liên kết giữa các bản ghi liên quan được lưu trữ bên trong.
Hãy tưởng tượng làm điều này chính mình. Bạn có một danh sách theo thứ tự chữ cái của học sinh và một cuốn sổ ghi chép với tất cả các báo cáo điểm của học sinh (một trang cho mỗi lớp). Sổ ghi chép được sắp xếp theo thứ tự theo tên của học sinh, theo thứ tự giống như danh sách. Làm thế nào bạn muốn tiến hành?
- Đọc tên từ danh sách.
- Mở vở ra.
- Tìm tên của học sinh.
- Đọc điểm của học sinh, lật trang cho đến khi bạn đến được học sinh tiếp theo hoặc trang cuối cùng.
- Đóng vở.
- Nói lại.
Hoặc là:
- Mở cuốn sổ ra trang đầu tiên.
- Đọc tên từ danh sách.
- Đọc bất kỳ điểm nào cho tên đó từ sổ ghi chép.
- Lặp lại các bước 2-3 cho đến khi bạn kết thúc
- Đóng vở.