参数化SQL, 性能的调优抑或是杀手?
[ 2007-12-13 00:26:29 | 作者: progame ]
参数化SQL一直以来是提高性能的重要手段, 其优势是显而易见的, 对于大量重复执行的SQL, 如果只是常量(插入值, 更新值, 比对值)不同, 可以重复使用执行计划, 减少了SQL编译时间, 因此简单SQL语句, 我个人认为参数化SQL的性能是不会比存储过程差的
还有很重要的一点, 起码是在SQL SERVER2000里, 非参数化的SQL很容易就导致内存上升, 而缓存的执行计划命中率又低, 因此对数据库的整体性能颇受影响
但是, 见到常量就参数化就一定好么? 看下面例子:
select * from table where 1 = 2
exec sp_executesql N'SELECT * FROM table WHERE @P1 = @P2 ', N'@P1 int, @p2 int', 1,2
看看执行计划就知道了, 后者使用了全表扫描, 原因何在?
因为对于@p1 = @p2, 在进行执行计划分析时, 是根本无法判断是否为假的(其实再智能点还是可以的, 不是真就是假), 所以常量运算的话, 在不使用参数化SQL时是能够被查询优化器先期运行出来再决定执行计划的, 但参数化SQL之后, 通用的执行计划只能干瞪眼了
其实这也是一种通病, 东西做得通用了, 那么对具体的实际应用就要打折扣了
评论Feed: /feed.asp?q=comment&id=1377
还有很重要的一点, 起码是在SQL SERVER2000里, 非参数化的SQL很容易就导致内存上升, 而缓存的执行计划命中率又低, 因此对数据库的整体性能颇受影响
但是, 见到常量就参数化就一定好么? 看下面例子:
select * from table where 1 = 2
exec sp_executesql N'SELECT * FROM table WHERE @P1 = @P2 ', N'@P1 int, @p2 int', 1,2
看看执行计划就知道了, 后者使用了全表扫描, 原因何在?
因为对于@p1 = @p2, 在进行执行计划分析时, 是根本无法判断是否为假的(其实再智能点还是可以的, 不是真就是假), 所以常量运算的话, 在不使用参数化SQL时是能够被查询优化器先期运行出来再决定执行计划的, 但参数化SQL之后, 通用的执行计划只能干瞪眼了
其实这也是一种通病, 东西做得通用了, 那么对具体的实际应用就要打折扣了
评论Feed: /feed.asp?q=comment&id=1377
标签:
Sql Server
查询优化
参数化SQL
执行计划
您可能感兴趣的文章:
Sql Server 自动查询优化有时候也是靠不住的 (progame at 2006-10-19)
Sql Server 2005 还真是聪明了很多 (progame at 2007-06-25)
转: MySQL查询优化系列讲座之数据类型与效率 (progame at 2007-07-07)
转: MySQL查询优化讲座之管理员的优化措施 (progame at 2007-07-07)
Only text pointers are allowed in work tables (progame at 2008-06-24)
SQLSERVER中对日期操作时的一个注意事项 (progame at 2006-06-07)
sql server 2000的一个bug (progame at 2006-09-23)
没有日志,只有MDF文件如何恢复数据库(转) (progame at 2006-10-17)
这篇日志没有评论.

