参数化查询

SQL SERVER在执行查语句时会生成查询计划,并将查询计划缓存在数据库中,如果下次执行相同的 SQL 语句时,会利用缓存的执行计划,而不必重新编译生成执行计划。

使用参数化查询,可以提高查询计划的重用率,提高执行效率。这里以 SQL SERVER 2005为例,分析一下 SQL SERVER查询的参数化。

SQL SERVER 2005中,可以使用以下 SQL SERVER语句查看缓存的执行计划:

SELECT usecounts, cacheobjtype, objtype, text

FROM sys . dm_exec_cached_plans

CROSS APPLY sys . dm_exec_sql_text ( plan_handle)

ORDER BY usecounts DESC ;

 

分析如下查询代码的执行:

      首先用 DBCC FreeProcCache命令清空缓存,以免其它查询计划的缓存影响分析,然后执行代码,然后查看缓存的计划有两个:

select * from t1 where col2 = 'abc'

select * from t1 where col2 = 'bcd'

可以看到 SQL SERVER为两个查询分别生成了一个查询计划,使用次数为 1,并没有重用任何查询计划。

 

      但如果我们使用参数化查询方式

执行后生成的查询计划为

(@strnvarchar(3))Select * From t1 Where col1 = @str

 

SQL SERVER生成了一个参数化的查询计划,并且这个查询计划的使用次数为 2 SQL SERVER重用了这个查询计划。

      当然这样参数化查询并不是最好的,尤其是对字符串类型的参数化查询, SQL SERVER会为不同长度的参数生成不同的查询计划,如:

SQL SERVER生成两个查询计划,

(@str nvarchar(4))Select * From t1 Where col1 = @str

(@str nvarchar(3))Select * From t1 Where col1 = @str

因此使用存储过程是重用查询计划的最好方案,因为 SQL SERVER会将整个存储过程生成的查询计划缓存,无论传入参数是什么,每次都会重用存储过程的查询计划。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值