【发布时间】:2010-12-21 00:23:11
【问题描述】:
在我脑海中沸腾了很久的问题,以下两个存储过程中哪一个会执行得更好。
过程 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
过程 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 语句”。
如果使用 @IncludeDepartmentInfo 的交替值调用 proc 1/proc 2,那么据我了解,proc 2 会执行得更好,因为无论@IncludeDepartmentInfo 的值如何,它都会保留相同的查询计划,而 proc1 将更改查询计划每次通话
答案真的很重要
PS:这只是一个场景,请不要去显式查询结果而是例子的本质。我对查询优化器的结果非常特别(在“if 和 where”的两种情况下以及它们的区别),我知道有很多方面会影响我想在这个问题中避免的性能。
【问题讨论】:
标签: sql-server tsql query-optimization