`

优化游标性能

    博客分类:
  • Jdbc
阅读更多

原文 http://dreams75.iteye.com/blog/474864

 

最好的改进光标性能的技术就是:能避免时就避免使用游标。



——摘自《Transact-SQL权威指南》 Ken Henderson[著]

    最好的改进光标性能的技术就是:能避免时就避免使用游标。SQL Server是关系数据库,其处理数据集比处理单行好得多,单独行的访问根本不适合关系DBMS。若有时无法避免使用游标,则可以用如下技巧来优化游标的性能。
(1). 除非必要否则不要使用static/insensitive游标。打开static游标会造成所有的行都被拷贝到临时表。这正是为什么它对变化不敏感的原 因——它实际上是指向临时数据库表中的一个备份。很自然,结果集越大,声明其上的static游标就会引起越多的临时数据库的资源争夺问题。
(2). 除非必要否则不要使用keyset游标。和static游标一样,打开keyset游标会创建临时表。虽然这个表只包括基本表的一个关键字列(除非不存在唯一关键字),但是当处理大结果集时还是会相当大的。
(3). 当处理单向的只读结果集时,使用fast_forward代替forward_only。使用fast_forward定义一个forward_only,则read_only游标具有一定的内部性能优化。
(4). 使用read_only关键字定义只读游标。这样可以防止意外的修改,并且让服务器了解游标移动时不会修改行。
(5). 小心事务处理中通过游标进行的大量行修改。根据事务隔离级别,这些行在事务完成或回滚前会保持锁定,这可能造成服务器上的资源争夺。
(6). 小心动态光标的修改,尤其是建在非唯一聚集索引键的表上的游标,因为他们会造成“Halloween”问题——对同一行或同一行的重复的错误的修改。因为 SQL Server在内部会把某行的关键字修改成一个已经存在的值,并强迫服务器追加下标,使它以后可以再结果集中移动。当从结果集的剩余项中存取时,又会遇到 那一行,然后程序会重复,结果造成死循环。
(7). 对于大结果集要考虑使用异步游标,尽可能地把控制权交给调用者。当返回相当大的结果集到可移动的表格时,异步游标特别有用,因为它们允许应用程序几乎马上就可以显示行。
Halloween:

Sql代码
  1. CREATE   Table  #T(  
  2.     k1 int  identity(1,1),  
  3.     c1 int   null   
  4. );  
  5.    
  6. CREATE  CLUSTERED  INDEX  C1  ON  #T(C1);  
  7.    
  8. INSERT   INTO  #T(C1)  VALUES (8)  
  9. INSERT   INTO  #T(C1)  VALUES (6)  
  10. INSERT   INTO  #T(C1)  VALUES (7)  
  11. INSERT   INTO  #T(C1)  VALUES (5)  
  12. INSERT   INTO  #T(C1)  VALUES (3)  
  13. INSERT   INTO  #T(C1)  VALUES (0)  
  14. INSERT   INTO  #T(C1)  VALUES (9)  
  15.    
  16.    
  17. DECLARE  C  CURSOR   DYNAMIC   
  18.     FOR   SELECT  K1,C1  FROM  #T;  
  19.    
  20. OPEN  C  
  21. FETCH  C  
  22. WHILE(@@FETCH_Status=0)  
  23. BEGIN   
  24.     UPDATE  #T  SET  C1=C1+1  
  25.         WHERE   CURRENT   OF  C;  
  26.     FETCH  C;  
  27. END   
  28.    
  29. CLOSE  C;  
  30. DEALLOCATE  C;  
  31.    
  32. DROP   Table  #T;  
  33. GO  
CREATE Table #T(
    k1 int identity(1,1),
    c1 int null
);
 
CREATE CLUSTERED INDEX C1 ON #T(C1);
 
INSERT INTO #T(C1) VALUES(8)
INSERT INTO #T(C1) VALUES(6)
INSERT INTO #T(C1) VALUES(7)
INSERT INTO #T(C1) VALUES(5)
INSERT INTO #T(C1) VALUES(3)
INSERT INTO #T(C1) VALUES(0)
INSERT INTO #T(C1) VALUES(9)
 
 
DECLARE C CURSOR DYNAMIC
    FOR SELECT K1,C1 FROM #T;
 
OPEN C
FETCH C
WHILE(@@FETCH_Status=0)
BEGIN
    UPDATE #T SET C1=C1+1
        WHERE CURRENT OF C;
    FETCH C;
END
 
CLOSE C;
DEALLOCATE C;
 
DROP Table #T;
GO
分享到:
评论

相关推荐

    C#对于Oracle游标一般处理程序速度的测试

    3. 执行查询,设置CommandBehavior为SequentialAccess以优化游标性能。 4. 获取OracleDataReader,这将返回一个只读、向前的游标。 5. 使用Read方法逐行读取数据,处理每行数据。 6. 完成后,关闭OracleDataReader和...

    oracle游标优化

    2. **优化游标查询**: - 使用索引而不是全表扫描来提高查询速度。 - 避免在WHERE子句中使用复杂的表达式,这可能使得Oracle无法使用索引。 - 对于经常使用的查询,考虑创建物化视图。 3. **使用FOR循环代替游标...

    JAVA全面知识

    2. **Oracle教程**:Oracle是一种广泛应用的关系型数据库管理系统,游标.doc可能涵盖了如何在Oracle中使用游标进行数据处理,游标在复杂查询和循环处理中的作用,以及如何优化游标性能。了解Oracle数据库对于任何...

    ORACLE 游标使用示例

    因此,在设计应用程序时,应尽可能优化游标的使用,避免无谓的资源消耗。 在"游标.txt"文件中,可能包含了更多关于Oracle游标的使用实例和技巧,包括游标的声明、动态游标、游标变量、游标表达式以及游标在存储过程...

    SQL-Server2005技术内幕

    - **游标的高效使用技巧**:本章将介绍如何正确地使用游标以避免性能瓶颈,包括何时使用游标、如何优化游标性能等最佳实践。 #### 知识点四:动态SQL - **动态SQL概述**:动态SQL是指在运行时构建和执行的SQL语句...

    TSQL 存储过程 游标 数据库 sql优化 存储过程分页

    【TSQL 存储过程】 ...了解如何创建、修改和删除存储过程,以及如何利用游标和进行SQL优化,对于提升数据库系统的性能和效率至关重要。同时,存储过程分页则能帮助在大数据量下提供更好的用户体验。

    数据库游标使用详细介绍

    #### 使用WHERE子句优化游标 在声明游标时,合理使用WHERE子句可以极大地提高查询效率和准确性。WHERE子句可以帮助过滤掉不相关的数据,减少数据处理量,从而提升整体性能。 #### 结论 游标是Oracle数据库中一项...

    Oracle数据库游标使用.rar

    因此,应尽量优化游标使用,避免不必要的数据库调用。 “Oracle数据库游标使用大全.pdf”这份文档可能详细介绍了以上内容,并提供了具体的示例代码和实践技巧,帮助读者深入理解和应用Oracle数据库游标。通过学习和...

    SQL Server 游标用法

    在SQL Server中,游标是一种重要的工具,它允许我们逐行处理查询结果集,而不仅仅是一次性获取所有数据。游标提供了在结果集中向前或...然而,为了优化性能,应当在必要时才使用游标,并确保在使用后正确地关闭和释放。

    Oracle 游标使用大全

    Oracle游标是数据库管理系统中的一种数据处理机制,它允许用户按需逐行处理查询结果,而不是一次性加载所有数据。...通过学习和实践,我们可以提升数据库操作的效率和灵活性,优化应用程序的性能。

    进程达到最大游标数

    总结来说,"进程达到最大游标数"是数据库管理中常见的问题,它涉及到程序设计、数据库配置和性能优化等多个方面。通过深入理解游标的工作原理,合理编写代码,以及有效利用数据库系统提供的工具和参数调整,可以有效...

    oracle 游标,存储过程,SQL优化的总结

    Oracle数据库作为广泛应用的关系型数据库管理系统,其游标、存储过程和SQL优化是提升系统性能的关键技术。本文将深入探讨这些概念及其在实际工作中的应用。 首先,游标是数据库操作中一种处理数据集的方式,允许...

    mysql游标

    虽然游标提供了灵活性,但它们也可能影响性能,因为每次提取数据都需要数据库交互。因此,在能用集约式操作(如JOINs或GROUP BY)解决问题时,应尽量避免使用游标。 至于标签“源码”和“工具”,可能指的是游标在...

    Oracle存储过程实例使用显示游标

    在Oracle数据库中,存储过程是预编译的SQL和PL/SQL代码集合,它们可以执行特定的任务并提高数据库性能。游标是处理单行或多行数据集的一种机制,允许...在实际应用中,还需要注意优化游标操作,避免不必要的性能开销。

    jdbcTemplate分页彻底解决,使用游标滚动

    在实际应用中,我们可能还需要考虑并发和性能优化,例如,如果多个线程同时访问,可能需要使用连接池来管理数据库连接,以提高效率并避免资源耗尽。 总结来说,`JdbcTemplate`配合游标滚动是一种有效的分页解决方案...

    sql存储过程和游标的运用

    * 提高数据库的性能:存储过程可以预编译和优化,减少了数据库的负载。 * 提高安全性:存储过程可以限制用户的访问权限,提高数据库的安全性。 * 提高开发效率:存储过程可以重复使用,减少了开发时间和成本。 结论...

    ORACLE SQL性能优化系列

    ORACLE SQL性能优化系列 ORACLE SQL性能优化是数据库管理员和开发者非常关心的一个话题。为了提高数据库的性能,ORACLE 提供了多种优化技术。下面我们将详细介绍 ORACLE SQL 性能优化系列中的一些重要知识点。 一...

    触发器和游标理论 中文

    尽管触发器和游标在某些情况下非常有用,但过度依赖它们可能导致性能问题,因为它们增加了数据库的处理负担。因此,在设计数据库方案时,应谨慎考虑是否真正需要使用触发器和游标,并尽量优化其使用。 总结一下,...

    事务和游标的概述,使用游标的步骤,及相关联系

    事务是数据库操作的基本单元...它们是数据库设计和优化的重要工具,能够帮助我们更高效、安全地管理和操作数据库中的数据。在实际开发中,根据具体业务需求灵活运用这些概念和技术,可以显著提升系统的性能和用户体验。

Global site tag (gtag.js) - Google Analytics