还是关于乱建ID导致效率低下

今天改的一个存储过程发现改了还是效率低下,仔细看了看,原来那个是一个IP日志表,因为没有适当的索引,导致全表的聚集扫描,速度非常慢。仔细分析了一下:
IPLog:
一个自增ID,一个访问时间,一个访问次数,一个IP,4个字段,80万记录。
索引:一个聚集索引在自增ID上。
执行以下语句:
set   statistics  io  on
set   statistics  time  on
exec  IPLogInsert  ' 255.255.255.255 '   
结果:
SQL Server 执行时间:
   CPU 时间 
=   0  毫秒,占用时间  =   1  毫秒。
表 
' IPLog ' 。扫描计数  1 ,逻辑读取  3737  次,物理读取  0  次,预读  0  次,lob 逻辑读取  0  次,lob 物理读取  0  次,lob 预读  0  次。

SQL Server 执行时间:
   CPU 时间 
=   172  毫秒,占用时间  =   514  毫秒。

SQL Server 执行时间:
   CPU 时间 
=   0  毫秒,占用时间  =   1  毫秒。
表 
' IPLog ' 。扫描计数  0 ,逻辑读取  3  次,物理读取  0  次,预读  0  次,lob 逻辑读取  0  次,lob 物理读取  0  次,lob 预读  0  次。

SQL Server 执行时间:
   CPU 时间 
=   0  毫秒,占用时间  =   252  毫秒。

SQL Server 执行时间:
   CPU 时间 
=   172  毫秒,占用时间  =   771  毫秒。
SQL Server 分析和编译时间: 
   CPU 时间 
=   0  毫秒,占用时间  =   1  毫秒。


优化:
将自增ID去掉,将聚集索引建在accesstime上
执行同样语句结果如下:
SQL Server 分析和编译时间: 
   CPU 时间 
=   16  毫秒,占用时间  =   30  毫秒。

SQL Server 执行时间:
   CPU 时间 
=   0  毫秒,占用时间  =   1  毫秒。

SQL Server 执行时间:
   CPU 时间 
=   0  毫秒,占用时间  =   1  毫秒。
表 
' IPLog ' 。扫描计数  1 ,逻辑读取  4  次,物理读取  0  次,预读  0  次,lob 逻辑读取  0  次,lob 物理读取  0  次,lob 预读  0  次。

SQL Server 执行时间:
   CPU 时间 
=   0  毫秒,占用时间  =   24  毫秒。

SQL Server 执行时间:
   CPU 时间 
=   0  毫秒,占用时间  =   1  毫秒。
表 
' IPLog ' 。扫描计数  0 ,逻辑读取  3  次,物理读取  0  次,预读  0  次,lob 逻辑读取  0  次,lob 物理读取  0  次,lob 预读  0  次。

SQL Server 执行时间:
   CPU 时间 
=   0  毫秒,占用时间  =   6  毫秒。

SQL Server 执行时间:
   CPU 时间 
=   16  毫秒,占用时间  =   61  毫秒。
SQL Server 分析和编译时间: 
   CPU 时间 
=   0  毫秒,占用时间  =   1  毫秒。


很鲜明的对比,这就是我一直强调的日志类型表不要建ID的典型范例。

[IPLogInsert]详细:
--  =============================================    
--
 Author:  Xiangxiang  
--
 Create date:2008-5-29   
--
 Description: Insert a IP log   
  --  =============================================    
alter   PROCEDURE   [ dbo ] . [ IPLogInsert ]    
   
@IP   char ( 15 =   ' 255.255.255.255 '   
  
AS     
BEGIN      
SET  NOCOUNT  ON ;    
declare   @currId   int     
declare   @today   datetime     
-- SET @currID = 0    
SET   @today   =   getdate ()      
 
-- SELECT @currId = id    from IPLog      
--
where convert(char(10), @today,101) = convert(char(10),AccessTime, 101)    and @IP = IP  if( @currID = 0)    
--
 insert into IPLog (AccessTime,IP,[Count])     
--
 values (@today, @IP, 1)   
--
 else     
--
 update IPLog      
--
 SET [count]=[count]+1     
--
 WHERE convert(char(10), @today,101) = convert(char(10),AccessTime, 101)     and @IP = IP   
--
 END      
update  IPlog  set   Count   =   Count + 1  
where  Ip  =   @IP  
and  AccessTime  between   dateadd ( day , 1 , datediff ( day , 0 , @today - 1 ))  and    dateadd ( day , 1 , datediff ( day , 0 , @today ))  

if ( @@rowcount   = 0
 
begin    
insert   into  IPLog (AccessTime,IP, [ Count ] )     
values  ( @today , @IP , 1 )    
end   
end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值