SQL执行效率,执行计划

1.通过SQL Server Profiler来跟踪执行的sql语句,如下图

  通过查看Duration来查看执行这一步话费了多场时间。

2.通过查看Sql执行计划来查看
     set statistics profile on  --打开
     set statistics profile off  --关闭
  
   SQL Server会采用三种方式做表之间的联接: Nested Loops join, Merge Join, Hash Join(Sql Server会自行选择最优联接方式,可以暂时不予考虑优化)
  
  更加具体的执行过程:
   
     主要看这几列:
Rows 】:表示在一个执行步骤中,所产生的记录条数。(真实数据,非预期)
Executes 】:表示某个执行步骤被执行的次数。(真实数据,非预期)
Stmt Text 】:表示要执行的步骤的描述。
EstimateRows 】:表示要预期返回多少行数据。

Sql Server 会有以下方法来查找您需要的数据记录:
1. 
Table Scan】:遍历整个表,查找所匹配的记录行。这个操作将会一行一行的检查,当然,效率也是最差的。
2. 
Index Scan】:根据索引,从表中过滤出来一部分记录,再查找所匹配的记录行,显示比第一种方式的查找范围要小,因此比【Table Scan】要快。
3. 
Index Seek】:根据索引,定位(获取)记录的存放位置,然后取得记录,因此,比起前二种方式会更快。
4. 
Clustered Index Scan】:和【Table Scan】一样。注意:不要以为这里有个Index,就认为不一样了。 其实它的意思是说:按聚集索引来逐行扫描每一行记录,因为记录就是按聚集索引来顺序存放的。 而【Table Scan】只是说:要扫描的表没有聚集索引而已,因此这二个操作本质上也是一样的
5. 
Clustered Index Seek】:直接根据聚集索引获取记录,最快!

总结一下:

所以,当发现某个查询比较慢时,可以首先检查哪些操作的成本比较高,再看看那些操作是查找记录时,

1.是不是Table Scan】或者【Clustered Index Scan】;

    主要是看这两种,如果有这种方式,就可以通过增加索引来解决,达到Clustered Index Seek的方式来查找数据。


2.使用分区和分表

分区的意义一般在于:
当表中不同行集拥有不同的访问方式,eg:某某表只会对当月或近期的数据做selectupdatedelete等操作,而前几个月的数据是只读的。此时可以利用时间作为界线来进行分区。
当表的数据量超级大的时候。

参照文档:点击打开链接


3.通过下列方式直接查看Sql语句执行了多久

declare @begin_date datetime
declare @end_date datetime
select @begin_date = getdate()
...您的sql语句
select @end_date = getdate()
select datediff(ms,@begin_date,@end_date) as '用时/毫秒'



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值