2008-11-30 35 views
32
SELECT NR_DZIALU, COUNT (NR_DZIALU) AS LICZ_PRAC_DZIALU 
    FROM PRACOWNICY 
    GROUP BY NR_DZIALU 
    HAVING NR_DZIALU = 30 

hoặcCâu lệnh SQL nào nhanh hơn? (CÓ vs WHERE ...)

SELECT NR_DZIALU, COUNT (NR_DZIALU) AS LICZ_PRAC_DZIALU 
    FROM PRACOWNICY 
    WHERE NR_DZIALU = 30 
    GROUP BY NR_DZIALU 

Trả lời

56

Lý thuyết (theo lý thuyết tôi có nghĩa là SQL Standard) nói rằng WHERE hạn chế tập kết quả trước khi trả về hàng và HAVING hạn chế tập hợp kết quả sau khi đưa tất cả các hàng. Vì vậy, nhanh hơn. Trên các DBMS tuân thủ chuẩn SQL về vấn đề này, chỉ sử dụng HAVING nơi bạn không thể đặt điều kiện trên một WHERE (như các cột được tính toán trong một số RDBMS.)

Bạn chỉ có thể thấy kế hoạch thực hiện cho cả hai và tự kiểm tra, sẽ không có gì đánh bại điều đó (đo lường truy vấn cụ thể trong môi trường cụ thể của bạn với dữ liệu của bạn.)

+0

dưới Sybase DB nó có cùng thời gian thực hiện cho 150 hàng :) –

+0

Tôi đã nói kế hoạch thực hiện, nơi bạn có thể xem các bước cơ sở dữ liệu sẽ thực hiện để lấy dữ liệu của bạn. 150 hàng là quá ít để nhận thấy bất kỳ sự khác biệt nào trong thời gian thực hiện, nhưng nếu khác nhau của kế hoạch, thì điều đó sẽ quan trọng trên các bảng có số lượng hàng lớn hơn. "đặt showplan trên" trước khi chạy truy vấn ... –

+0

... sẽ cung cấp cho bạn dữ liệu trên Sybase. Kiểm tra liên kết này để biết thêm thông tin: http://groups.google.com/group/comp.databases.sybase/browse_thread/thread/abd5e99d77befbfa? pli = 1 –

2

tôi mong đợi mệnh đề WHERE sẽ nhanh hơn, nhưng nó có thể họ sẽ tối ưu hóa để giống hệt nhau.

8

Nó có thể phụ thuộc vào động cơ. Ví dụ MySQL, áp dụng HAVING gần như cuối cùng trong chuỗi, có nghĩa là hầu như không có chỗ cho tối ưu hóa. Từ manual:

Điều khoản HAVING được áp dụng gần đây nhất, ngay trước khi các mục được gửi cho khách hàng, không tối ưu hóa. (LIMIT được áp dụng sau khi HAVING.)

Tôi tin rằng hành vi này giống nhau trong hầu hết các công cụ cơ sở dữ liệu SQL, nhưng tôi không thể đảm bảo nó.

+1

Heh, "nó phụ thuộc vào động cơ nhưng tôi tin rằng tất cả họ đều cư xử như thế này" :-) –

+3

Vâng, tôi chỉ có thể nói về những gì tôi biết và suy đoán về phần còn lại :) –

5

Hai truy vấn tương đương và trình tối ưu hóa truy vấn DBMS của bạn nên nhận ra điều này và sản xuất tạo ra cùng một kế hoạch truy vấn. Nó có thể không, nhưng tình hình là khá đơn giản để nhận ra, vì vậy tôi mong đợi bất kỳ hệ thống hiện đại - thậm chí Sybase - để đối phó với nó.

Điều khoản sử dụng phải được sử dụng để áp dụng các điều kiện về chức năng nhóm, nếu không chúng có thể được điều chỉnh trong điều kiện WHERE. Ví dụ. nếu bạn muốn giới hạn truy vấn của mình cho các nhóm có COUNT (DZIALU)> 10, giả sử bạn cần đặt điều kiện vào HAVING vì nó hoạt động trên các nhóm, chứ không phải các hàng riêng lẻ.

2

Nói rằng họ sẽ tối ưu hóa không thực sự kiểm soát và nói cho máy tính phải làm gì. Tôi đồng ý rằng việc sử dụng không có thay thế cho mệnh đề where. Có một cách sử dụng đặc biệt được áp dụng cho một nhóm bằng cách sử dụng một cái gì đó giống như một sum() và bạn muốn giới hạn tập hợp kết quả để chỉ hiển thị các nhóm có tổng()> hơn 100 mỗi giây. Có hoạt động trên các nhóm, Nơi hoạt động trên hàng. Họ là táo và cam. Vì vậy, thực sự, họ không nên được so sánh vì chúng là hai loài động vật rất khác nhau.

0

Cả hai câu lệnh sẽ có hiệu suất giống như SQL Server đủ thông minh để phân tích cả hai câu lệnh giống nhau thành một kế hoạch tương tự.

Vì vậy, việc bạn sử dụng WHERE hoặc HAVING trong truy vấn của mình là không quan trọng.

Nhưng, lý tưởng bạn nên sử dụng mệnh đề WHERE cú pháp.

Các vấn đề liên quan