Hôm trước tôi đã học được vài điều đơn giản về SQL.
Có kết quả giống như.
Đ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 Show
Thí dụ
Truy vấn bên dưới sử dụng
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-2016Trong khi 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? Ngày 15 tháng 3 năm 2022 • 7 phút đọc 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 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 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 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.
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 ColinThậ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ồ. 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ứuTô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
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) Giải mã kết quả ProcMonTô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
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ờiMộ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 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ệpTổng thời gian để viết. tệp tmp chỉ là 0. 012 giây
Đ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
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ùngMệ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
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. Tài liệu tham khảo bên ngoàiChuyệ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 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ảoJetShowKế 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 Không còn thiết lập nữaMike WolfeHì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 |