参数化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: /feed.asp?q=comment&id=1377

这篇日志没有评论.

发表
表情图标
[smile] [confused] [cool] [cry]
[eek] [angry] [wink] [sweat]
[lol] [stun] [razz] [redface]
[rolleyes] [sad] [yes] [no]
[heart] [star] [music] [idea]
UBB代码
转换链接
表情图标
悄悄话
用户名:   密码:   (非注册用户不需要输入密码) 注册?
验证码(不区分大小写) * 请输入验证码