Sự khác biệt giữa khác biệt và nhóm theo là gì?

Hôm trước tôi đã học được vài điều đơn giản về SQL.

SELECT c FROM myTbl GROUP BY C

Có kết quả giống như.

SELECT DISTINCT C FROM myTbl

Điều tôi tò mò là có điều gì khác biệt trong cách một công cụ SQL xử lý lệnh hay chúng thực sự giống nhau?

Cá nhân tôi thích cú pháp riêng biệt hơn, nhưng tôi chắc chắn rằng nó không theo thói quen hơn bất kỳ thứ gì khác

Thí dụ

GROUP BY được sử dụng kết hợp với các hàm tổng hợp. Xem xét bảng sau

orderIduserIdstoreNameorderValueorderDate143Store A2520-03-2016257Store B5022-03-2016343Store A3025-03-2016482Store C1026-03-2016521Store A4529-03-2016

Truy vấn bên dưới sử dụng GROUP BY để thực hiện các phép tính tổng hợp

SELECT
    storeName,
    COUNT(*) AS total_nr_orders,
    COUNT(DISTINCT userId) AS nr_unique_customers,
    AVG(orderValue) AS average_order_value,
    MIN(orderDate) AS first_order,
    MAX(orderDate) AS lastOrder
FROM
    orders
GROUP BY
    storeName;

và sẽ trả lại thông tin sau

storeNametotal_nr_ordersnr_unique_customersaverage_order_valuefirst_orderlastOrderStore A3233. 320-03-201629-03-2016Cửa hàng B115022-03-201622-03-2016Cửa hàng C111026-03-201626-03-2016

Trong khi DISTINCT được sử dụng để liệt kê sự kết hợp duy nhất của các giá trị riêng biệt cho các cột được chỉ định

SELECT DISTINCT
    storeName,
    userId
FROM
    orders;
cửa hàngNameuserIdStore A43Store B57Store C82Store A21

Cả hai mệnh đề GROUP BY và DISTINCT đều có thể được sử dụng để tạo kết quả giống hệt nhau. Nhưng cái nào nhanh hơn trong Access?

  • Sự khác biệt giữa khác biệt và nhóm theo là gì?

Mike Wolfe

Ngày 15 tháng 3 năm 2022 7 phút đọc

Sự khác biệt giữa khác biệt và nhóm theo là gì?

Trong một số trường hợp nhất định, các mệnh đề DISTINCT và GROUP BY có thể được sử dụng để tạo ra các kết quả giống hệt nhau–nhưng mệnh đề này luôn nhanh hơn mệnh đề kia

Tôi đã nghiên cứu rất nhiều cho bài nói chuyện sắp tới của mình về Khắc phục sự cố hiệu suất truy vấn. Là một phần của nghiên cứu đó, tôi đã xem bài đăng sau đây của chuyên gia truy cập Colin Riddington

Chuyện hoang đường - CHỌN DISTINCT so với NHÓM THEO

Xin chào tất cảTôi đã cập nhật Mythbusters của mình. Chủ đề WHERE vs HAVING ngày hôm quahttps. //www. lập trình viên truy cập. đồng. uk/forums/threads/mythbusters-speed-so sánh-kiểm tra-có-vs-ở đâu. 302225 Khi tôi làm như vậy, @CJ_London đã nhắc tôi về một yêu cầu trước đó để kiểm tra những điều sau. Chúng ta thường thấy OP sử dụng tổng hợp

Truy cập Diễn đàn Thế giớiisladogs

Sự khác biệt giữa khác biệt và nhóm theo là gì?

Colin đang phản hồi yêu cầu từ người dùng @CJ_London

Chúng ta thường thấy OP sử dụng các truy vấn tổng hợp mà không có bất kỳ tổng hợp nào thay vì CHỌN DISTINCT - bạn có ví dụ nào để so sánh CHỌN DISTINCT v GROUP BY với một hoặc hai tiêu chí không?

Colin rất tò mò nên đã nghĩ ra một bài kiểm tra tốc độ để so sánh hai. Tuy nhiên, trước khi công bố kết quả, anh ấy đã yêu cầu mọi người dự đoán mệnh đề nào sẽ thắng. Cảm giác ruột thịt của Colin – phù hợp với cảm giác của tôi và hầu hết những người được hỏi – là mệnh đề SELECT DISTINCT sẽ nhanh hơn. Hóa ra điều ngược lại mới đúng

GROUP BY luôn nhanh hơn SELECT DISTINCT

Đọc để tìm hiểu lý do tại sao

Tái tạo kết quả

Trước khi đi quá xa, tôi muốn chạy thử nghiệm trên máy tính của mình để xem liệu tôi có nhận được kết quả tương tự không

Sau khi chạy thử nghiệm nhiều lần, tôi thấy rằng GROUP BY luôn nhanh hơn khoảng 5 - 10% so với SELECT DISTINCT

Sự khác biệt giữa khác biệt và nhóm theo là gì?
Sự khác biệt giữa khác biệt và nhóm theo là gì?
Sự khác biệt giữa khác biệt và nhóm theo là gì?
Sự khác biệt giữa khác biệt và nhóm theo là gì?

Thử nghiệm duy nhất không giải quyết được vấn đề này là khi tôi chỉ chạy mỗi truy vấn một lần. Tôi đã làm điều này như một phần trong phân tích của mình mà tôi sẽ đề cập sau trong bài viết. Trên thực tế, khi tôi xuất bản bài viết này lần đầu, ảnh chụp màn hình cuối cùng ở trên là ảnh duy nhất tôi đưa vào – do đó làm suy yếu toàn bộ các phát hiện của tôi

[Lời khuyên dành cho Karl Donaubauer, người đã thông báo riêng cho tôi. và khá ngoại giao. rằng tôi vừa tự lừa mình bằng cách viết hơn 1.000 từ về lý do tại sao GROUP BY nhanh hơn DISTINCT khi bằng chứng duy nhất tôi đăng cho thấy điều ngược lại. ]

Và đó là lý do tại sao bạn luôn chạy thử nghiệm hiệu năng nhiều lần–để giảm tác động của các biến thể bên ngoài trong quá trình thử nghiệm (chẳng hạn như các ứng dụng khác tạm thời sử dụng bộ xử lý)

Tại sao NHÓM THEO nhanh hơn CHỌN DISTINCT?

Colin đã đăng kế hoạch trình chiếu JetShowPlan. ra các tệp cho hai truy vấn mà anh ấy đã kiểm tra

Sự khác biệt giữa khác biệt và nhóm theo là gì?

Colin lưu ý rằng kết quả "gần như giống hệt nhau. "

Điểm khác biệt chính là ở dòng cuối cùng của mỗi đầu ra.  

  • CHỌN KHÁC BIỆT. store result in temporary table
  • NHÓM THEO.

    SELECT DISTINCT C FROM myTbl
    0

Colin kết luận phân tích của mình với điều này

Tôi cũng ngạc nhiên với kết quả này & tôi không có lời giải thích nào ngoài bằng chứng từ JET ShowPlan

Kiểm tra lý thuyết của Colin

Thật may mắn cho tôi, Colin đã tải lên cơ sở dữ liệu thử nghiệm của anh ấy, vì vậy tôi dễ dàng tiếp tục từ nơi anh ấy dừng lại

Nếu tôi nhìn xa hơn thì đó là đứng trên vai người khổng lồ.
- Ngài Isaac Newton

Dựa trên các kết quả nhất quán của Colin, tôi đã đưa ra giả thuyết rằng sự khác biệt trong hai kết quả có thể dựa trên thực tế là mệnh đề chậm hơn đang ghi kết quả của nó vào một "bảng tạm thời" trong khi mệnh đề nhanh hơn thì không. Nhưng làm thế nào tôi có thể đưa điều đó vào thử nghiệm?

ProcMon để giải cứu

Tôi đã chia tay người bạn đáng tin cậy của mình, Trình giám sát quy trình và thiết lập bộ lọc sau

  • BAO GỒM. Tên quy trình là msaccess. người cũ
  • BAO GỒM. Thao tác là WriteFile
Sự khác biệt giữa khác biệt và nhóm theo là gì?

Sau đó, tôi chạy từng bài kiểm tra của Colin với một vòng lặp duy nhất để giảm thiểu kết quả đầu ra của procmon. Rút gọn kết quả vẫn ra nhiều dữ liệu (bản chất procmon là vậy). Tuy nhiên, tôi thấy kết quả khá hấp dẫn (nếu hơi khó giải mã đối với người không quen biết)

Sự khác biệt giữa khác biệt và nhóm theo là gì?

Giải mã kết quả ProcMon

Tôi đã thêm màu vào ảnh chụp màn hình ở trên để làm nổi bật một số phần chính

  • Hồng. CHỌN mệnh đề DISTINCT (store result in temporary table)
  • Màu xanh da trời. Mệnh đề NHÓM THEO (

    SELECT DISTINCT C FROM myTbl
    0)
  • Vàng. tệp tạm thời được tạo để giữ "bảng tạm thời"
  • màu xanh lá. số 0. Độ trễ 1 giây ngay trước thao tác WriteFile đầu tiên trên tệp tạm thời

Các phần vàng và xanh lá cây có thể sử dụng chi tiết hơn một chút. Bây giờ chúng ta hãy thảo luận về những điều đó

Vàng. Tệp tạm thời

Một trong những điều tôi thích ở ProcMon là được xem xúc xích được tạo ra như thế nào ở mức thấp nhất của hệ điều hành

Đây là một số khái niệm trừu tượng mà Joel Spolsky đã viết trong bài báo nền tảng của mình, "Luật trừu tượng rò rỉ. "  Ví dụ: viết một tệp trong VBA có thể chỉ bằng một dòng mã. Tuy nhiên, ở cấp độ hệ điều hành, các bit không được di chuyển trong một thao tác đơn lẻ. Thay vào đó, chúng được ghi vào tệp đích theo khối, dựa trên kích thước khối của đĩa. Trong trường hợp này, kích thước khối là 4.096 byte (4K)

Nếu quan sát kỹ, bạn có thể thấy 147.456 byte được lưu trữ trong tệp


SELECT DISTINCT C FROM myTbl
3. Thật thú vị, byte đầu tiên được lưu trữ thực sự được lưu trữ trong byte cuối cùng của khối thứ tư của tệp (Offset. 16.383, Chiều dài. 1). Sau đó, các byte từ 0 đến 16.384 được ghi vào tệp (i. e. , bốn khối 4k đầu tiên).  

Sau đó, byte tiếp theo được lưu trữ là byte cuối cùng trong khối thứ 36 và khối cuối cùng của tệp (Offset. 147.455, Chiều dài. 1). Sau đó, các byte từ 16.385 đến 147.456 được ghi vào tệp (mặc dù một số khối dường như đã bị bỏ qua do có khoảng cách lớn hơn 4K giữa Độ lệch 73.728 và 86.016)

Lý thuyết của tôi ở đây là các thao tác WriteFile một byte là một cách để buộc đĩa phân bổ một số khối cùng một lúc (có lẽ, với hy vọng rằng các khối đó sẽ tiếp giáp về mặt vật lý trên đĩa). Nhưng tôi lạc đề

Điểm mấu chốt ở đây là thực tế là điều này. tập tin tmp hoàn toàn tồn tại

Vì không có tệp tạm thời tương tự nào được tạo cho mệnh đề GROUP BY, tôi tin rằng điều này có thể giải thích sự khác biệt về hiệu suất nhất quán giữa hai mệnh đề

màu xanh lá. Chi phí tạo tệp

Tổng thời gian để viết. tệp tmp chỉ là 0. 012 giây

 10:53:30.2340579 PM
-10:53:30.2218845 PM
---------------------
 00:00:00.0121734 seconds

Điều này một mình dường như không đủ để giải thích cho sự khác biệt 5 - 10% giữa các mệnh đề GROUP BY và SELECT DISTINCT từ thử nghiệm của tôi. Điều này khiến tôi tin rằng phần lớn sự khác biệt – ít nhất là trong trường hợp này – đến từ một số chi phí khác liên quan đến việc tạo tệp

Nếu chúng ta nhìn vào thao tác WriteFile đầu tiên cho. tmp và so sánh nó với thao tác WriteFile trước đó cho giao diện người dùng. cơ sở dữ liệu accdb, chúng tôi tìm thấy sự khác biệt là 0. 12 giây

 10:53:30.2218845 PM
-10:53:30.1062746 PM
---------------------
 00:00:00.1156099 seconds

Tôi đã lọc ra các hoạt động khác từ các kết quả này để tối đa hóa tỷ lệ tín hiệu trên tạp âm. Vì vậy, chi phí ban đầu cần thiết để ghi tệp có thể nhỏ hơn 0. 12 giây. Tuy nhiên, tôi thực sự nghĩ rằng nó có thể góp phần nhiều–hoặc nhiều hơn–vào sự khác biệt về tốc độ tổng thể giữa GROUP BY và DISTINCT

Suy nghĩ cuối cùng

Mệnh đề GROUP BY nhanh hơn mệnh đề SELECT DISTINCT (ít nhất là trong các thử nghiệm này) vì nó không yêu cầu ghi vào tệp tạm thời trên đĩa

Mặc dù tôi ngần ngại nói rằng "NHÓM THEO nhanh hơn CHỌN DISTINCT" trong mọi tình huống, nhưng tôi cảm thấy tự tin khi nói rằng giờ đây chúng ta có thể tính đến sự khác biệt về hiệu suất giữa hai mệnh đề này (ít nhất là trong trường hợp này)

Ngoài ra, vì sự khác biệt dường như dựa trên việc một tệp có được lưu vào đĩa hay không, tôi cho rằng sự khác biệt sẽ rõ rệt hơn trên các máy có ổ cứng quay chậm (5400 RPM) so với các máy có ổ SSD tốc độ cao (chẳng hạn như máy của tôi

Tóm tắt

  • GROUP BY nhanh hơn một chút so với SELECT DISTINCT
  • Ổ đĩa càng chậm, sự khác biệt càng lớn
  • Đây có thể không phải là quy tắc chung (chúng tôi chỉ thử nghiệm các trường hợp đơn giản)
  • Sự khác biệt hầu như không đáng chú ý đối với người dùng
  • Các thử nghiệm này đã được thực hiện trên các bảng cơ sở dữ liệu phụ trợ của Access và có thể không phù hợp với các loại nguồn dữ liệu khác (e. g. , bảng được liên kết SQL Server)

Lời khuyên cuối cùng của tôi.  

• Tất cả những thứ khác đều bình đẳng, hãy sử dụng GROUP BY để phát triển mới.
• Đừng hy sinh khả năng đọc để đạt được hiệu suất nhỏ.
• Không thay đổi các truy vấn hiện có (không đáng đâu).

Tài liệu tham khảo bên ngoài

Chuyện hoang đường - CHỌN DISTINCT so với NHÓM THEO

Xin chào tất cảTôi đã cập nhật Mythbusters của mình. Chủ đề WHERE vs HAVING ngày hôm quahttps. //www. lập trình viên truy cập. đồng. uk/forums/threads/mythbusters-speed-so sánh-kiểm tra-có-vs-ở đâu. 302225 Khi tôi làm như vậy, @CJ_London đã nhắc tôi về một yêu cầu trước đó để kiểm tra những điều sau. Chúng ta thường thấy OP sử dụng tổng hợp

Truy cập Diễn đàn Thế giớiisladogs

Sự khác biệt giữa khác biệt và nhóm theo là gì?

Xin gửi lời cảm ơn đặc biệt đến Colin Riddington (isladogs) vì đã bỏ công sức tạo ra dây đai thử nghiệm và sau đó xuất bản nó ra thế giới

Bài viết tham khảo

JetShowKế hoạch. sơn lót

Bạn có thể đã quen thuộc với JetShowPlan, nhưng tôi đảm bảo rằng bạn chưa bao giờ đọc một bài báo nào về nó giống như bài viết này

Sự khác biệt giữa khác biệt và nhóm theo là gì?
Không còn thiết lập nữaMike Wolfe

Sự khác biệt giữa khác biệt và nhóm theo là gì?

Hình ảnh được cung cấp bởi Maïlys Jans từ Pixabay

CẬP NHẬT [2022-03-16]. Đã thêm phần "Tái tạo kết quả" và đăng thêm ảnh chụp màn hình để hỗ trợ những phát hiện tổng thể của tôi (h/t Karl Donaubauer)

CẬP NHẬT [2022-03-16]. Đã sửa đổi "lời khuyên cuối cùng" của tôi để bao gồm một lưu ý về việc không hy sinh khả năng đọc để đạt được hiệu suất nhỏ (h/t Joakim Dalby)

CẬP NHẬT [2022-03-16]. Đã làm rõ rằng những kết quả này áp dụng cho bảng Access, không nhất thiết phải là các loại bảng khác, chẳng hạn như bảng SQL Server được liên kết (h/t AHeyne)

Tại sao GROUP BY lại tốt hơn khác biệt?

Mệnh đề GROUP BY nhanh hơn mệnh đề SELECT DISTINCT (ít nhất là trong các thử nghiệm này) vì mệnh đề này không yêu cầu ghi vào tệp tạm thời trên đĩa.

NHÓM THEO có hiệu quả hơn khác biệt không?

Vì vậy, mặc dù DISTINCT và GROUP BY giống hệt nhau trong nhiều tình huống, đây là một trường hợp mà cách tiếp cận GROUP BY chắc chắn dẫn đến hiệu suất tốt hơn (với chi phí là ý định khai báo ít rõ ràng hơn trong chính truy vấn)

Sự khác biệt giữa khác biệt và duy nhất là gì?

“Khác biệt” có nghĩa là tổng số giá trị khác nhau bất kể giá trị đó xuất hiện bao nhiêu lần trong tập dữ liệu. Một tên xuất hiện trong danh sách nhiều lần được tính là 1 số riêng biệt. Trong khi đó, giá trị “Duy nhất” là tổng số giá trị chỉ xuất hiện một lần

Sự khác biệt giữa khác biệt và duy nhất trong SQL là gì?

Từ khóa UNIQUE trong SQL đóng vai trò ràng buộc cơ sở dữ liệu; . Mặt khác, từ khóa DISTINCT được sử dụng trong câu lệnh SELECT để tìm nạp các hàng riêng biệt từ một bảng