Вопрос от довольно долгого кипения в моей голове, что из следующих двух хранимых процедур одна из них будет работать лучше.
Proc 1
CREATE PROCEDURE GetEmployeeDetails @EmployeeId uniqueidentifier,
@IncludeDepartmentInfo bit
AS
BEGIN
SELECT * FROM Employees
WHERE Employees.EmployeeId = @EmployeeId
IF (@IncludeDepartmentInfo = 1)
BEGIN
SELECT Departments.* FROM Departments, Employees
WHERE Departments.DepartmentId = Employees.DepartmentId
AND Employees.EmployeeId = @EmployeeId
END
END
Proc 2
CREATE PROCEDURE GetEmployeeDetails @EmployeeId uniqueidentifier,
@IncludeDepartmentInfo bit
AS
BEGIN
SELECT * FROM Employees
WHERE Employees.EmployeeId = @EmployeeId
SELECT Departments.* FROM Departments, Employees
WHERE Departments.DepartmentId = Employees.DepartmentId
AND Employees.EmployeeId = @EmployeeId
AND @IncludeDepartmentInfo = 1
END
единственное различие между ними заключается в использовании 'if statment'.
если proc 1 / proc 2 вызывается с чередующимися значениями @IncludeDepartmentInfo, то, по моему пониманию, proc 2 будет работать лучше, потому что он сохранит один и тот же план запроса независимо от значения @IncludeDepartmentInfo, тогда как proc1 изменит план запроса в каждый звонок
ответы действительно оценены
PS: это всего лишь сценарий, пожалуйста, не переходите к явным результатам запроса, а суть примера. Я действительно особенно внимателен к результатам оптимизатора запросов (в обоих случаях «если и где» и их разнице), есть много аспектов, которые, как я знаю, могут повлиять на производительность, которых я хочу избежать в этом вопросе.