2008-09-22 24 views
11

Tôi có hai bảng chứa Tác vụ và Ghi chú và muốn truy xuất danh sách tác vụ với số lượng ghi chú được liên kết cho từng ghi chú. Hai truy vấn này thực hiện công việc:Giao dịch-SQL - truy vấn phụ hoặc tham gia bên trái?

select t.TaskId, 
     (select count(n.TaskNoteId) from TaskNote n where n.TaskId = t.TaskId) 'Notes' 
from Task t 

-- or 
select t.TaskId, 
     count(n.TaskNoteId) 'Notes' 
from Task t 
left join 
     TaskNote n 
on  t.TaskId = n.TaskId 
group by t.TaskId

Có sự khác biệt nào giữa chúng và tôi nên sử dụng cái kia hay chỉ là hai cách làm cùng một công việc? Cảm ơn.

Trả lời

12

Trên bộ dữ liệu nhỏ mà chúng đang rửa khi nói đến hiệu suất. Khi được lập chỉ mục, LOJ tốt hơn một chút.

Tôi đã tìm thấy trên các tập dữ liệu lớn mà tham gia bên trong (tham gia bên trong cũng sẽ hoạt động.) Sẽ hoạt động tốt hơn truy vấn phụ bởi một yếu tố rất lớn (xin lỗi, không có số).

+0

ditto về tham gia bên trong - Tôi đã thấy rằng tạo sự khác biệt lớn trên tập hợp lớn (giả sử đó là hành vi chính xác bạn muốn và bạn có thể cần sử dụng hàm ISNULL() hoặc hàm tương tự) –

0

Bạn có thể sử dụng hoặc là giống hệt nhau về mặt ngữ nghĩa. Nói chung, quy tắc chung là sử dụng bất kỳ biểu mẫu nào dễ đọc hơn, trừ khi hiệu suất là một vấn đề.

Nếu hiệu suất là một vấn đề, sau đó thử nghiệm bằng cách viết lại truy vấn bằng cách sử dụng biểu mẫu khác. Đôi khi trình tối ưu hóa sẽ sử dụng chỉ mục cho một biểu mẫu và không phải là chỉ mục khác.

1

Không có câu trả lời rõ ràng về điều này. Bạn nên xem SQL Plan. Xét về đại số quan hệ, chúng về cơ bản là tương đương.

6

Trong hầu hết các trường hợp, trình tối ưu hóa sẽ xử lý chúng giống nhau.

Tôi có xu hướng thích thứ hai, vì nó có ít lồng ghép hơn, giúp dễ đọc và dễ bảo trì hơn. Tôi đã bắt đầu sử dụng các biểu thức bảng chung của SQL Server để giảm làm tổ cũng vì lý do tương tự.

Bên cạnh đó, cú pháp thứ hai là linh hoạt hơn nếu có uẩn hơn nữa có thể được bổ sung trong thời gian tới ngoài việc COUNT, như MIN (some_scalar), MAX(), AVG() vv

2

Nếu bạn đang sử dụng SQL Server Management Studio, bạn có thể nhập cả hai phiên bản vào Trình soạn thảo truy vấn và sau đó nhấp chuột phải và chọn Hiển thị kế hoạch thực hiện ước tính. Nó sẽ cung cấp cho bạn hai chi phí phần trăm tương ứng với lô. Nếu họ dự kiến ​​sẽ dùng cùng một lúc, cả hai sẽ hiển thị là 50% - trong trường hợp đó, chọn bất cứ điều gì bạn thích vì các lý do khác (dễ đọc hơn, dễ bảo trì hơn, phù hợp hơn với các tiêu chuẩn mã hóa của bạn, v.v.). Nếu không, bạn có thể chọn cái có chi phí phần trăm thấp hơn so với lô.

Bạn có thể sử dụng kỹ thuật tương tự để xem xét việc thay đổi bất kỳ truy vấn nào để cải thiện hiệu suất bằng cách so sánh hai phiên bản thực hiện tương tự. Tất nhiên, bởi vì nó là một chi phí liên quan đến lô, điều đó không có nghĩa là truy vấn nhanh như nó có thể - nó chỉ cho bạn biết cách chúng so sánh với nhau, chứ không phải một số truy vấn tối ưu có được kết quả tương tự.

5

Truy vấn con sẽ chậm hơn khi truy vấn con được thực hiện cho mỗi hàng trong truy vấn bên ngoài. Việc tham gia sẽ nhanh hơn khi nó được thực hiện một lần. Tôi tin rằng trình tối ưu hóa truy vấn sẽ không viết lại kế hoạch truy vấn này vì nó không thể nhận ra sự tương đương.

Thông thường bạn sẽ tham gia và nhóm theo loại số này. Các truy vấn phụ tương ứng của sắp xếp mà bạn hiển thị chủ yếu là quan tâm nếu chúng phải thực hiện một số thuộc tính nhóm hoặc phức tạp hơn trên một bảng không tham gia vào một phép nối khác.

1

Tôi làm cho nó là một điểm để tránh truy vấn phụ bất cứ khi nào có thể. Việc tham gia nói chung sẽ hiệu quả hơn.

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