sql - SQL Server 存储过程性能影响
问题描述
我想编写可用于多用途的存储过程。谁能帮助我从这些方法中找到在 SQL Server 中编写存储过程的最佳实践?它们每个对性能的影响是什么?
方法一:参数@KEY、@VALUE
IF @KEY = 'ISACTIVE'
BEGIN
SELECT ID, STATECODE, STATENAME, ISACTIVE
FROM STATE
WHERE ISACTIVE = @VALUE
END
ELSE IF @KEY = 'STATECODE'
BEGIN
SELECT ID, STATECODE, STATENAME, ISACTIVE
FROM STATE
WHERE STATECODE = @VALUE
END
ELSE
BEGIN
SELECT ID, STATECODE, STATENAME, ISACTIVE
FROM STATE
END
方法:2个参数@ISACTIVE,@STATECODE
SELECT ID, STATECODE, STATENAME, ISACTIVE
FROM STATE
WHERE ISACTIVE = ISNULL(@ISACTIVE, ISACTIVE)
AND STATECODE = ISNULL(@STATECODE,STATECODE)
方法:3
参数@KEY、@VALUE
DECLARE @SQLQRY NVARCHAR(500)
SET @SQLQRY = 'SELECT ID, STATECODE, STATENAME, ISACTIVE FROM STATE WHERE ' + @KEY +' = ' + @VALUE
EXEC @SQLQRY
就性能和可重用性而言,哪一种是最好的方法?
或者还有其他选择可以实现这一目标吗?
解决方案
我肯定会使用Approach 2,在我看来,它既可维护又可永久使用。
在方法 1中,您正在复制代码,因此在维护方面它不是最好的方法。
在使用动态 sql 查询的方法 3中,这不是最好的处理方式,因为它不提供智能感知支持,并且限制了 SQL 服务器优化性能的能力。
如果您遇到任何性能问题,请考虑在“ISACTIVE”和“STATECODE”列上引入索引。如果需要,还分析查询执行计划并使用分析器进行进一步调查。
推荐阅读
- c++ - malloc - 运行时内存指针类型分配
- c - 为什么这个while循环没有中断?
- javascript - 如何使用 babel cli 构建整个项目结构
- mfc - IFileDialog 或 SHBrowseForFolder:如何打开显示“计算机”的内容,最好不显示左侧的桌面等?
- c++ - 本地 std::bernoulli_distribution 如何创建准确分布的数据?
- python - 在 Firebase 中将图像从 Storage 加载到 Cloud Functions
- c - 以分号结尾的while循环
- exception - exchangeElements 过程 MASM 中的异常错误
- vim - xxd 没有行号但保留字符编码
- python - 就地合并排序报告索引超出范围错误