欢迎投稿

今日深度:

游标脚本性能问题详解之案例实践篇(1)

游标脚本性能问题详解之案例实践篇(1)


游标类型对性能影响的实例。下面的两个游标脚本分别创建并执行了dynamic和fast forward only两种类型的游标。

知识补充:

关系数据库中的操作会对整个行集起作用。由 SELECT 语句返回的行集包括满足该语句的 WHERE 子句中条件的所有行。这种由语句返回的完整行集称为结果集。应用程序并不总能将整个结果集作为一个单元来有效地处理。这些应用程序需要一种机制以便每次处理一行或一小部分行。游标不仅可提供这种机制,而且是对结果集的一种扩展。

游标通过执行以下操作来扩展结果集处理:

不理想的游标类型:(dynamic游标)

  1. declare @p1 int  set @p1=NULL    
  2. declare @p2 int  set @p2=0    
  3. declare @p5 int  set @p5=4098  
  4. declare @p6 int  set @p6=8193    
  5. declare @p7 int  set @p7=0    
  6.  
  7. exec sp_cursorprepexec @p1 output,@p2 output,N'@P1 varchar(30),@P2 varchar(15)',  
  8. N'  
  9. SELECT       T1.CONFLICT_ID  
  10. FROM         dbo.S_AUDIT_ITEM T1              
  11. LEFT OUTER JOIN dbo.S_USER T2   
  12. ON T1.USER_ID = T2.PAR_ROW_ID      
  13. WHERE  ((T1.BC_BASE_TBL = @P1)    
  14. AND  (T1.RECORD_ID = @P2))      
  15. ORDER BY  T1.OPERATION_DT DESC    
  16. OPTION (FAST 40)  
  17. ',  
  18. @p5 output,@p6 output,@p7 output,'1-10350J','S_PARTY'    
  19.  
  20. print 'fetch' 
  21. exec sp_cursorfetch @p2,2,4,1    
  22.  
  23. exec sp_cursorclose @p2 

理想的游标类型(fast forward only游标)

  1. declare @p1 int  set @p1=NULL    
  2. declare @p2 int  set @p2=0    
  3. declare @p5 int  set @p5=4112  
  4. declare @p6 int  set @p6=8193    
  5. declare @p7 int  set @p7=0    
  6.  
  7. exec sp_cursorprepexec @p1 output,@p2 output,N'@P1 varchar(30),@P2 varchar(15)',  
  8. N'  
  9. SELECT       T1.CONFLICT_ID  
  10. FROM         dbo.S_AUDIT_ITEM T1              
  11. LEFT OUTER JOIN dbo.S_USER T2   
  12. ON T1.USER_ID = T2.PAR_ROW_ID      
  13. WHERE  ((T1.BC_BASE_TBL = @P1)    
  14. AND  (T1.RECORD_ID = @P2))      
  15. ORDER BY  T1.OPERATION_DT DESC    
  16. OPTION (FAST 40)  
  17. ',  
  18. @p5 output,@p6 output,@p7 output,'S_SRV_REQ','1-WUQTM6'    
  19.  
  20. select @p1, @p2, @p5, @p6, @p7  
  21.  
  22. print '2' 
  23. exec sp_cursorfetch @p2,2,1,1    
  24. print '3' 
  25. exec sp_cursorclose @p2 

注:脚本中用到的和游标有关的存储过程,请参考:http://jtds.sourceforge.net/apiCursors.html#_sp_cursorprepexec

一、如何解读游标的类型

  1. sp_cursorprepexec [@handle =] statement_handle OUTPUT,  
  2.      [@cursor =] cursor_handle OUTPUT,  
  3.      [@paramdef =] N'parameter_name data_type, [,...n]'   
  4.      [@stmt =] N'stmt',  
  5.      [, [@scrollopt =] scroll_options OUTPUT]  
  6.      [, [@ccopt =] concurrency_options OUTPUT]  
  7.      [, [@rowcount =] rowcount OUTPUT]  
  8.  
  9. @scrollopt  

 

[@ccopt

 

@p5=4098 转成16进制就是1002,对应的游标类型为Parameterized query + Dynamic cursor

@p5=4112 转成16进制就是1010,对应的游标类型为Parameterized query + Fast forward-only cursor

问题的现象是,左边的游标类型下,该脚本执行时间远大于右边的游标类型。


www.htsjk.Com true http://www.htsjk.com/shujukugl/17835.html NewsArticle 游标脚本性能问题详解之案例实践篇(1) 游标类型对性能影响的实例。下面的两个游标脚本分别创建并执行了dynamic和fast forward only两种类型的游标。 知识补充: 关系数据库中的操作会对...
评论暂时关闭