06年在校学习数据库课程, 到今年也有7个年头.这7年之间装过Oracle, 折腾过MySQL, 当然花时间最多的还是在SQL Server 2008. 可是认知还是停留在left join, select..into,基本上算是在啃老本,少有长进。忏悔无用,还是继续啃红宝书《Beginning - Microsoft SQL Server 2008 Programming》.
本文来扯扯SQL Server 2008的执行计划。SQL语句在执行时,会生成执行计划并将它缓存起来,我们可以通过提高使用缓存中的执行计划次数,来减少数据库的压力。在SQL Server Management Studio 中选择[Query]-[Dispaly estimated execution plan] 或[Include Actual Execution Plan]查看当前的执行计划。两个菜单的区别不用详述了,前者是估算出来的,后者是在执行后的结果中显示实际的执行计划。对一些简单的Select语句来说,estimated和actual的执行计划是一样,对并行,还有涉及到临时表的操作来说可能有不同。
测试数据
create table test(
id bigint,
insertedDateTime datetime
)
declare @i int
declare @dt datetime
set @i = 1
while @i <= 10000
begin
insert into test
values(@i,GETUTCDATE())
set @i = @i +1
end
统计
set statistics profile on
use appletest
select * from appletest..test
set statistics profile on 是打开profile,类似地还有set statistics time on ,用于Messages中显示执行时间(如下)。相应的关闭语句是set statistics profile off
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 142 ms.
查询缓存执行计划
SQL Server 2008提供了一些服务器对象来分析执行计划
Sys.dm_exec_cached_plans: 包含缓存的执行计划,每个执行计划对应一行。
Sys.dm_exec_plan_attributes: 这是一个系统函数,每一个执行计划都对应着一些属性,在这个系统函数中包含着这些属性。
Sys.dm_exec_sql_text: 这是一个系统函数,返回文字格式的执行计划。
Sys.dm_exec_query_plan: 这是一个系统函数,返回xml格式的执行计划。
SQL Server 2008还提供了一个兼容性的视图sys.syscacheobject,这个视图中保存了所有的执行计划的信息。
SELECT cp.usecounts AS '使用次数'
,objtype AS '类型'
,st.[text] AS 'SQL文本'
,plan_handle AS '计划句柄'
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st
--WHERE st.text not like '%sys%'
综上所述,我们可以通过执行计划去分析Query的效率,并可以参数化SQL,来重用执行计划,从而提高效率。
参考资料:
http://blog.csdn.net/xiao_hn/article/details/4259628 了解SQL Server执行计划
http://www.blogjava.net/jiabao/archive/2008/04/08/191595.html 关于sql的执行计划
http://www.cnblogs.com/dataadapter/archive/2012/08/02/2620711.html SQL参数化查询的另一个理由――命中执行计划