gpt4 book ai didi

sql-server - SQL Server 存储过程 - 'IF statement' 与 'Where criteria'

转载 作者:行者123 更新时间:2023-12-02 22:25:20 25 4
gpt4 key购买 nike

这个问题在我脑海中沸腾了很长时间,即以下两个存储过程中哪一个执行得更好。

过程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”的情况下以及它们的差异),我知道有很多方面可能会影响性能,而我想在这个问题中避免这些方面。

最佳答案

SELECT Departments.* FROM Departments, Employees
WHERE Departments.DepartmentId = Employees.DepartmentId
AND Employees.EmployeeId = @EmployeeId
AND @IncludeDepartmentInfo = 1

当 SQL 编译这样的查询时,必须针对 @IncludeDepartmentInfo 的任何值进行编译。结果计划很可能是扫描表并执行连接并之后检查变量,从而导致不必要的 I/O。优化器可能很聪明,会将变量检查移到执行计划中的实际 I/O 操作之前,但这永远无法保证。这就是为什么我总是建议在 T-SQL 中对需要根据变量值执行非常不同的查询(典型的示例是 OR 条件)使用显式 IF。

gbn 的观察也很重要:从 API 设计的角度来看,最好具有一致的返回类型(即始终返回相同形状和数量的结果集)。

关于sql-server - SQL Server 存储过程 - 'IF statement' 与 'Where criteria',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1809134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com