Tôi luôn nhận thấy biểu đồ xuất sắc của Itzik Ben-Gan về xử lý SQL logic vô cùng hữu ích trong việc suy luận về hiệu suất truy vấn. Mặc dù biểu đồ được tạo cho SQL Server, nó vẫn có thể áp dụng cho bất kỳ công cụ cơ sở dữ liệu nào tuân theo SQL Standard, cũng bao gồm công cụ cơ sở dữ liệu Access. Mặc dù chúng tôi thích sử dụng cơ sở dữ liệu SQL Server, nhưng thỉnh thoảng chúng tôi có cơ sở dữ liệu Access hoặc ứng dụng Access yêu cầu sử dụng truy vấn Access (ví dụ:bảng tạm thời để báo cáo). Quyền truy cập không đi kèm với các công cụ tạo hồ sơ ưa thích, vậy chúng ta phải làm gì?
Jerry gian lận tiện ích theo dõi của riêng chúng tôi
Điều đó khiến tôi tự hỏi - người ta có thể xác định khi nào một mệnh đề của truy vấn SQL được thực thi không và tần suất ra sao? Access có nghĩa là hiển thị các kế hoạch thực thi nhưng nó không đi vào chi tiết về cách thức và thời điểm xử lý các chi tiết cụ thể. Có một cách vòng vo để suy ra vật lý thứ tự xử lý được sử dụng bởi công cụ cơ sở dữ liệu Access:một hàm VBA tùy chỉnh!
Public Function Trace (EventName As String, Optional Value As Variant) As Boolean If IsMissing (Value) Then Debug.Print EventName, "#No Value #" Else Debug.Print EventName, Value End If Trace =TrueEnd FunctionĐiều này có thể được lưu trong một mô-đun tiêu chuẩn. Sau đó, chúng ta có thể thiết lập một bảng đơn giản:
Theo dõi các mệnh đề của truy vấn Access
Với thiết lập đó, chúng tôi có thể tạo truy vấn Access và rắc
Trace
trong các phần khác nhau của truy vấn Access. Đây là một ví dụ:CHỌN c1.ColorID, Trace ("CHỌN") AS Bỏ qua1, Dấu vết ("CHỌN", c1.Color) AS Bỏ qua2FROM tblColor AS c1 WHERE Trace ("WHERE") <> 0 VÀ Dấu vết ("WHERE", c1 .Color) <> 0ORDER BY Trace ("ORDER BY"), Trace ("ORDER BY", c1.Color);Sau đó, nếu bạn mở truy vấn trong dạng xem biểu dữ liệu, sau đó chuyển đến cửa sổ ngay lập tức của VBIDE, bạn sẽ thấy kết quả như sau:
WHERE # Không có giá trị # ĐẶT HÀNG THEO # Không có giá trị # CHỌN # Không có giá trị # WHERE RedORDER BY RedWHERE GreenORDER BY GreenWHERE BlueORDER BY BlueSELECT BlueSELECT GreenSELECT RedĐiều này cung cấp cho chúng tôi một số thông tin chi tiết về cách Access đang giải quyết truy vấn, điều này có thể hữu ích khi bạn cần tối ưu hóa một truy vấn hoạt động kém. Hãy xem chúng ta có thể học được gì:
- Chúng ta có thể thấy rằng nếu không có tham chiếu cột nào, thì hàm VBA được gọi sớm nhất có thể vì Access nhận ra rằng chúng chỉ có thể có một giá trị cho toàn bộ tập kết quả, vì vậy không có ích gì khi gọi đi gọi lại hàm mà thôi. để có câu trả lời tương tự. Bạn có thể thấy rằng
Trace
các lệnh gọi không có đối số tùy chọn thứ 2 sẽ được đánh giá đầu tiên trước tất cả các lệnh gọi khác có chứa tham chiếu cột trong đối số tùy chọn thứ 2. - Như một hệ quả cho điểm trước đó, nếu lời gọi có chứa tham chiếu cột, thì nó phải được đánh giá ít nhất một lần cho mỗi hàng. Bạn có thể thấy rằng chúng tôi xem xét từng giá trị màu khi đánh giá điều khoản.
- Chúng tôi thấy rằng thứ tự nói chung tương tự như những gì chúng tôi thấy trong biểu đồ của Itzik Ben-Gan;
WHERE
được đánh giá sớm nhất có thể,ORDER BY
được đánh giá sau khi chúng tôi đã loại bỏ tất cả các hàng không đủ điều kiện, sau đó bất kỳ hàng nào còn lại,SELECT
sau đó được đánh giá. - Mặc dù chúng tôi mong muốn sắp xếp được áp dụng sau khi chúng tôi đã lọc ra các hàng không đủ điều kiện, nhưng có vẻ như Access thích thử và sắp xếp đầu ra càng sớm càng tốt, có thể vì việc chèn một hàng mới vào một hàng đã sắp xếp sẽ rẻ hơn liệt kê hơn việc sắp xếp toàn bộ.
Các thử nghiệm và kết luận bổ sung
Bạn có thể thử nghiệm một chút với một truy vấn khác. Ví dụ:bạn có thể hiểu rõ thời điểm / thường xuyên Truy cập các quy trình GROUP BY
, bằng cách sử dụng một truy vấn tương tự như sau:
CHỌN c1.ColorID, Trace ("CHỌN") AS Bỏ qua1FROM tblColor AS c1 INNER JOIN tblColor AS c2 ON c1.ColorID =c2.ColorIDWHERE Trace ("WHERE") <> 0 AND Trace ("WHERE", [c1 ]. [Màu]) <> 0GROUP BY c1.ColorID, Trace ("GROUP BY", c1.Color) ĐẶT HÀNG THEO c1.ColorID;
Sau đó, bạn có thể sử dụng điều này kết hợp với JetShowPlan để tìm hiểu thêm về những gì công cụ cơ sở dữ liệu đang thực sự làm. Hy vọng rằng bạn có thể thấy hữu ích trong việc hiểu rõ hơn về cách bạn có thể cải thiện hiệu suất của truy vấn Access của mình. Như một thách thức, bạn có thể lý giải tại sao Access thực thi GROUP BY
theo cách nó làm. Tôi cũng khuyến khích bạn thử mở một biểu dữ liệu và cuộn. Sau đó, bạn sẽ phát hiện ra rằng SELECT
được đánh giá lại do điều hướng xung quanh.
Tôi nên chỉ ra rằng kỹ thuật ở trên cung cấp cho chúng ta cái nhìn sâu sắc về vật lý kế hoạch xử lý, chứ không phải thứ tự xử lý logic như được mô tả trong biểu đồ. Do đó, chúng ta nên mong đợi kế hoạch sẽ khác nhau đối với các khối lượng dữ liệu khác nhau hoặc cho các truy vấn khác nhau. Chúng tôi cũng phải xem xét việc thêm Trace
chức năng có thể ảnh hưởng đến kế hoạch. Tuy nhiên, tôi tranh luận rằng nếu bạn quá lo lắng về những cân nhắc đó, có lẽ tốt hơn nên chuyển truy vấn đó và dữ liệu cơ bản của nó sang cơ sở dữ liệu SQL Server nơi bạn có nhiều tùy chọn hơn để tối ưu hóa hiệu suất của truy vấn.
Chúc bạn vui vẻ!
Cần trợ giúp với các truy vấn Microsoft Access? Gọi cho các Chuyên gia về Quyền truy cập theo số (773) 809 5456 hoặc gửi email cho nhóm ngay hôm nay.