Việc thay đổi thứ tự các cột trong GROUP BY có ảnh hưởng đến hiệu suất không?


7

Tôi có một truy vấn SQL như thế này:

SELECT A, B, (CASE WHEN C=0 THEN 0 ELSE 1 END), COUNT(D)
FROM SomeTable
GROUP BY A, B, (CASE WHEN C=0 THEN 0 ELSE 1 END)

Trên một tập dữ liệu khổng lồ, kế hoạch thực hiện thực tế hầu hết thời gian cho một nút tương ứng với hoạt động logic Tổng hợphoạt động vật lý HashMatch .

Việc thay đổi thứ tự các cột và điều kiện được liệt kê trong GROUP BYdanh sách có ảnh hưởng đến hiệu suất không?

Câu trả lời:


7

Mặc dù tài liệu MSDN nói gì, không, nó không thành vấn đề đối với GROUP BYcác truy vấn.

Bạn có thể kiểm tra nó tại đây, tại: Kiểm tra SQL-Fiddle (SQL-Server 2012)

CREATE TABLE test
( id INT IDENTITY(1,1)
, a  INT NOT NULL
, b  INT NOT NULL
, c  INT NOT NULL
, d  INT NOT NULL
, PRIMARY KEY (id)
) ;

CREATE NONCLUSTERED INDEX a_b_c_include_d_index
    ON test (a, b, c)
    INCLUDE (d) ;

INSERT INTO test
(a, b, c, d)
VALUES
 ... some 50K rows

Các truy vấn:

SELECT COUNT(*) AS num
     , MIN(cnt) AS min_count
     , MAX(cnt) AS max_count
     , MIN(min_d) AS min_min_d
     , MAX(min_d) AS max_min_d
     , MIN(max_d) AS min_max_d
     , MAX(max_d) AS max_max_d
FROM
  ( SELECT a
         , b
         , c
         , COUNT(d) AS cnt
         , MIN(d) AS min_d
         , MAX(d) AS max_d
    FROM test 
    GROUP BY a, b, c             --- or with:  `GROUP BY b, a, c`
  ) AS grp ;

tạo ra cùng một kế hoạch thực hiện:

kế hoạch thực hiện

MICROSOFT SQL SERVER 2005 XML SHOWPLAN
SELECT
Compute Scalar
Cost: 0%
Stream Aggregate
(Aggregate)
Cost: 0%
Compute Scalar
Cost: 10%
Stream Aggregate
(Aggregate)
Cost: 10%
Index Scan
[a_b_c_include_d_index].[test]
Cost: 89%

Bây giờ nếu bạn thay đổi Nhóm đó bằng cách:

    GROUP BY a, b, c
      WITH ROLLUP

nó tạo ra sự khác biệt và nó tạo ra các kế hoạch thực hiện khác nhau (và tất nhiên các tập kết quả khác nhau). Mặc dù vậy, nó vẫn sử dụng chỉ mục, ít nhất là trong bài kiểm tra SQL-Fiddle đó. Đó là trường hợp thứ tự không khớp, nó lấy dữ liệu từ chỉ mục nhưng nó phải thực hiện một sắp xếp trung gian (để tính các giá trị cuộn lên).


2

Có, nếu bạn có một chỉ mục bao gồm các cột đó.

Theo tài liệu trên tại MSDN :

Trong ngữ cảnh của các chỉ mục nhiều cột, để ORDER-BY hoặc GROUP-BY xem xét một chỉ mục cụ thể, các cột ORDER-BY hoặc GROUP-BY phải khớp với bộ tiền tố của các cột chỉ mục với thứ tự chính xác. Ví dụ: chỉ mục

CREATE INDEX Emp_Name ON Employees ("Last Name" ASC, "First Name" ASC) 

có thể giúp tối ưu hóa các truy vấn sau:

... ORDER BY / GROUP BY "Last Name" ...
... ORDER BY / GROUP BY "Last Name", "First Name" ...

Nó sẽ không giúp tối ưu hóa:

... ORDER BY / GROUP BY "First Name" ...
... ORDER BY / GROUP BY "First Name", "Last Name" ...

2
GROUP BY "First Name", "Last Name"có giống như GROUP BY "Last Name", "First Name"không? Vì vậy, theo WHERE và ON, thứ tự không quan trọng. Đối với ĐẶT HÀNG B, NG, nó
gbn

Tài liệu bạn liên kết đến là dành cho SQL Server Compact 4.0
Martin Smith

1
@MartinSmith: Có lợi cho Jason, tài liệu cho phiên bản 2008 có cùng một thứ.
ypercubeᵀᴹ

@ypercube - liên kết? nhấp vào bộ chọn "phiên bản khác" dường như không hoạt động đối với tôi. Nó vẫn đưa tôi đến một bài viết thảo luận cụ thể về SQL Server Compact. Không biết liệu nó có đúng với các phiên bản nhỏ gọn hay không nhưng có lẽ chúng có một trình tối ưu hóa nguyên thủy hơn.
Martin Smith

@MartinSmith: Ồ bạn nói đúng, vâng, đã bỏ lỡ dòng đó. Vì vậy, chúng ta có thể cho rằng nó phụ thuộc vào phiên bản của SQL-Server không? Nếu có, còn Azure thì sao? Tôi không thể tìm thấy sự thông thạo.
ypercubeᵀᴹ
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.