Đầu tiên, ((J.Id = @Jobid and @Jobid>0) or @Jobid=0)
có thể được thay thế
bằng (@Jobid = 0 or J.Id = @Jobid)
.Lưu ý rằng kể từ 0
rõ ràng không phải là giá trị hợp lệ cho id công việc (hoặc nhân viên hoặc khách hàng tiềm năng), and
phần này không liên quan vì không có bản ghi nào chứa id bằng 0.
Thứ hai, không sử dụng 0
là một giá trị không hợp lệ, hãy sử dụng null
thay vì. nó sẽ không ảnh hưởng đến hiệu suất, nhưng đó là một thói quen lập trình tốt hơn, vì 0
rất có thể là một giá trị hợp lệ trong các tình huống khác.
Thứ ba, các truy vấn tóm tắt được biết là bị ảnh hưởng hiệu suất, đặc biệt là trong các thủ tục được lưu trữ, vì kế hoạch thực thi được lưu trong bộ nhớ cache có thể không phải là tốt nhất cho việc thực thi hiện tại. Theo hiểu biết của tôi, cách tốt nhất để xử lý vấn đề này là thêm gợi ý biên dịch lại vào truy vấn, như được đề xuất trong bài viết này và trong bài viết đó .
Vì vậy, tôi đề nghị truy vấn của bạn trông giống như sau:
CREATE PROCEDURE <procedure name>
(
@Jobid INT=NULL,
@leadid INT=NULL,
@employeeid INT=NULL
)
AS
SELECT e.id,
l.id,
j.id,
e.NAME,
l.NAME,
j.NAME
FROM employee e
INNER JOIN leads l
ON e.leadid = l.id
INNER JOIN Jobs j
ON j.id = e.Jobid
WHERE (@Jobid IS NULL OR J.Id = @Jobid)
AND (@leadid IS NULL OR l.Id = @leadid)
AND (@employeeid IS NULL OR e.Id = @employeeid)
OPTION(RECOMPILE)
GO
hiệu suất lựa chọn thường được cải thiện với việc lập chỉ mục chính xác của các bảng. Tuy nhiên, lập chỉ mục một cách chính xác đòi hỏi kiến thức không phải lập trình viên nào cũng có. Đó là một chủ đề rất đáng đọc. Tôi sẽ bắt đầu tại đây .