Mặc dù tài liệu MSDN nói gì, không, nó không thành vấn đề đối với GROUP BY
cá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:
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).
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ó