SQL Server Tham gia / nơi xử lý đơn hàng


18

Sau khi đọc truy vấn SQL chậm, không biết cách tối ưu hóa , tôi đã suy nghĩ về hiệu suất chung của các truy vấn. Chắc chắn, chúng ta cần kết quả của bảng đầu tiên (khi các bảng khác được nối) nhỏ nhất có thể trước khi tham gia (tham gia bên trong cho câu hỏi này) để làm cho các truy vấn của chúng tôi nhanh hơn một chút.

Ví dụ, nên:

SELECT *
FROM   ( SELECT * FROM table1 WHERE col = @val ) t
INNER JOIN table2 ON col = col2

Tốt hơn / nhanh hơn:

SELECT *
FROM table1
INNER JOIN table2 ON col = col2
WHERE table1.col = @val

Lý thuyết của tôi là như sau (đây có thể không phải là cách triển khai chính xác, tôi đang cố nhớ từ một cuốn sách nội bộ SQL Server 2008 mà tôi đã đọc (MSFT Press)):

  1. Bộ xử lý truy vấn trước tiên lấy bảng bên trái (bảng1)
  2. Tham gia bảng thứ hai (bảng2) và tạo thành một sản phẩm cartesian trước khi lọc ra các hàng cần thiết (nếu có)
  3. Sau đó thực hiện các mệnh đề WHERE, ORDER BY, GROUP BY, HAVING với câu lệnh SEELCT cuối cùng.

Vì vậy, nếu trong câu lệnh số 1 ở trên, bảng nhỏ hơn, công cụ SQL có ít việc phải làm hơn khi tạo các sản phẩm cartesian. Sau đó, khi bạn đạt đến câu lệnh where, bạn có tập kết quả giảm từ đó sẽ lọc trong bộ nhớ.

Tôi có thể đi xa đến mức không thực tế. Như tôi đã nói, đó là một lý thuyết.

Suy nghĩ của bạn?

Lưu ý : Tôi chỉ nghĩ về câu hỏi này và chưa có cơ hội tự mình thực hiện bất kỳ bài kiểm tra nào.

Lưu ý 2 : Được gắn thẻ là Máy chủ SQL vì tôi không biết về việc triển khai MySql, v.v ... Vui lòng trả lời / nhận xét nào.

Câu trả lời:


15

Việc xử lý logic của một truy vấn là trên MSDN (được viết bởi nhóm Microsoft SQL Server, không phải bên thứ 3)

1. FROM
2. ON
3. JOIN
4. WHERE
5. GROUP BY
6. WITH CUBE or WITH ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10. ORDER BY
11. TOP

Một bảng dẫn xuất tuân theo điều này, sau đó truy vấn bên ngoài thực hiện lại, v.v.

Điều này là hợp lý mặc dù: không thực tế . Bất kể SQL Server thực sự làm điều đó như thế nào, những ngữ nghĩa này được vinh danh cho bức thư . "Thực tế" được xác định bởi Trình tối ưu hóa truy vấn (QO) và bạn tránh sản phẩm Cartesion trung gian mà bạn đã đề cập.

Điều đáng nói là SQL có tính khai báo: bạn nói "cái gì" chứ không phải "như thế nào" như bạn muốn cho một chương trình thủ tục / mệnh lệnh (Java, .net). Vì vậy, việc nói "điều này xảy ra trước đó" là sai trong nhiều trường hợp (ví dụ: giả định về ngắn mạch hoặc thứ tự L-to-R WHERE)

Trong trường hợp của bạn ở trên, QO sẽ tạo ra cùng một kế hoạch cho dù nó được cấu trúc như thế nào vì đây là một truy vấn đơn giản.

Tuy nhiên, QO dựa trên chi phí và đối với một truy vấn phức tạp, có thể mất 2 tuần để tạo kế hoạch lý tưởng. Vì vậy, nó "đủ tốt" mà thực sự không phải là.

Vì vậy, trường hợp đầu tiên của bạn có thể giúp trình tối ưu hóa tìm ra kế hoạch tốt hơn vì thứ tự xử lý logic khác nhau cho 2 truy vấn. Nhưng nó có thể không.

Tôi đã sử dụng thủ thuật này trên SQL Server 2000 để cải thiện hiệu suất tốc độ 60 lần cho các truy vấn báo cáo. Khi QO cải tiến phiên bản thành phiên bản, nó sẽ trở nên tốt hơn khi xử lý những điều này.

Và cuốn sách bạn đã đề cập: có một số tranh chấp về nó
Xem SO và các liên kết tiếp theo: /programming//q/3270338/27535


6

Một truy vấn SQL về bản chất không phải là thủ tục, không có xử lý từ trên xuống dưới của các toán tử nối. Thứ tự các bảng trong các truy vấn mẫu của bạn không có ảnh hưởng đến kế hoạch thực hiện vì chúng tương đương về mặt logic và sẽ tạo ra chính xác cùng một kế hoạch.

Bạn đã từng đánh giá hai trong số các tùy chọn mà trình tối ưu hóa truy vấn có thể xem xét khi tạo kế hoạch cho truy vấn này. Yếu tố chính ảnh hưởng đến sự lựa chọn kế hoạch là số liệu thống kê cho các bảng liên quan và chi phí liên quan đến lựa chọn nhà điều hành trong bất kỳ kế hoạch ứng cử viên nào.

Một phép nối hai bảng rất đơn giản như ví dụ của bạn có thể được thỏa mãn với bất kỳ một trong hàng trăm kế hoạch thực hiện khác nhau. Trình tối ưu hóa quyết định đó sẽ là cách tốt nhất để trả lời truy vấn của bạn bằng cách so sánh chi phí của các gói này.

Đôi khi nó bị sai và bạn có thể giúp nó đưa ra lựa chọn tốt hơn thông qua việc lập chỉ mục được cải thiện, giữ cho số liệu thống kê được cập nhật và áp dụng các gợi ý. Trong những trường hợp rất hiếm, bạn có thể muốn buộc thứ tự thực hiện bằng cách sử dụng gợi ý FORCE ORDER nhưng điều đó nên được sử dụng một cách tiết kiệm. Đó là một cái búa để phá vỡ một hạt, trình tối ưu hóa thường có thể được trêu chọc để tạo ra các kế hoạch tốt hơn bằng cách cung cấp cho nó thông tin tốt hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.