`

如何避免使用游标

 
阅读更多

问题的提出  

  我们在根据一个结果集的内容,处理另一个结果集的时候,一般的会考虑到使用下面形式的游标:  

  游标定义  

  打开游标  

  从游标中取第一条数据  

  循环开始,以游标取数后的状态为循环控制条件  

  修改相关数据表的内容  

  从游标中取下一条数据  

  循环结束  

  关闭游标  

  上面的流程在处理的数据量比较小的时候没有什么问题,但如果两个结果集的数据量比较大,那么该游标的执行会产生大量的、长时间的锁,可能会造成其他用户的等待,甚至产生死锁。  

解决方案  

 不使用临时表

  如果作为循环控制条件的结果集中有可以唯一识别每一行数据的列,我们称为关键列,那么,我们可以把上面的流程改写为下面的形式:  

  从结果集中取出最小关键列的值  

  以最小关键列值为条件,取出其他列的数据  

  循环开始,以最小关键列是否有值为循环控制条件  

  修改相关数据表的内容  

  从结果集中取出比关键列大的最小值  

  循环结束  

  该流程的优点是比游标的方式执行效率高,并且不会由于资源的占用而造成其他用户的等待,更不会造成死锁。  

  该流程的缺点是:要求作为循环控制条件的结果集必须有关键列。  

使用临时表  

  如果作为循环控制条件的结果集没有关键列,我们也可以考虑把结果集存储在临时表中,并增加一个关键列,改写后的流程类似下面的形式:  

  create   table   #Temp(TempId   int   identity(1,1)   not   null,结果集其他列)  

  将结果集的数据插入到临时表  

  从临时表中取出最小关键列的值  

  以最小关键列值为条件,取出其他列的数据  

  循环开始,以最小关键列是否有值为循环控制条件  

  修改相关数据表的内容  

  从临时表中取出比关键列大的最小值  

  循环结束  

  该流程的优点是比游标的方式执行效率高,并且不会由于资源的占用而造成其他用户的等待,更不会造成死锁。  

  该流程的缺点是:如果临时表中记录数量比较大,比如上千条,那么该方法的效率可能不是很好,因为临时表也是   tempdb   数据库上的物理表,并且没有索引,所以大数据量的临时表的效率是不会很高的。

分享到:
评论

相关推荐

    Oracle存储过程游标详解

    "Oracle存储过程游标详解" Oracle 存储过程游标是指在 Oracle 数据库中使用游标来实现对结果集的处理和操作。...它可以帮助开发者更好地处理和操作结果集,但需要注意避免使用游标的场景和正确使用游标的方法。

    使用游标更新数据库

    使用游标更新数据库 使用游标更新数据库是指在游标定位下,修改或删除表中指定的数据行。使用游标对数据进行更新可以提高数据库的性能和效率。 1. 游标更新的基本概念 游标是数据库中的一种数据结构,它可以用来...

    关于存储过程和游标的总结

    关于存储过程和游标的总结 本文主要介绍了游标的概念、类型、状态和使用方法,以及存储过程的相关知识。 一、游标的概念 ...但是,在使用游标时,需要注意避免性能问题,并且合理使用游标类型和状态。

    mysql游标

    因此,在能用集约式操作(如JOINs或GROUP BY)解决问题时,应尽量避免使用游标。 至于标签“源码”和“工具”,可能指的是游标在开发工具(如MySQL Workbench或命令行客户端)中的使用,以及查看或调试包含游标的...

    SQL Server遍历表中记录的2种方法(使用表变量和游标)

    在能够使用集合操作(如JOIN、WHERE子句、聚合函数)的地方,尽量避免使用游标。 总结,遍历SQL Server表中的记录,可以采用表变量配合循环的方式,或者使用游标。表变量方法简洁且对数据的影响可控,但可能需要...

    既简单,又使用的游标实例

    然而,游标也有其局限性,如消耗更多资源、降低性能等,因此在能够使用集操作的地方,应尽量避免使用游标。 在"游標實例.txt"这个文件中,可能包含的是具体的SQL游标操作实例,通过阅读和理解这些实例,你可以更...

    sql server 游标试用方法 例子

    本篇文章将深入探讨SQL Server中的游标使用方法,并通过实例进行演示。 首先,我们需要了解游标的四种类型:静态、动态、键集和只读。静态游标在打开时获取全部数据,数据集不会随基础数据表的变化而更新;动态游标...

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

    游标滚动对于处理大量数据尤其有用,因为它可以在不一次性加载所有数据到内存的情况下进行操作,从而避免了内存压力。 JdbcTemplate的分页通常涉及两个主要步骤:查询总记录数和获取分页数据。传统的方式是通过...

    mysql游标实现到了最后一个结束之后结束循环

    1. 游标使用完毕后,记得用`CLOSE`语句关闭,以释放系统资源。 2. 游标在事务中使用时,如果事务回滚,游标可能不会回到开始位置,因此在事务中使用游标需谨慎。 3. 游标效率相对较低,因为它们需要额外的内存和处理...

    SQL游标原理和使用方法[借鉴].pdf

    然而,需要注意的是,游标可能会增加系统的开销,因为它需要额外的内存和CPU资源来管理,所以在能用集约型操作(如批处理)替代时,应尽量避免使用游标,以提高系统性能。 总之,SQL游标是数据库编程的重要组成部分...

    SQL 2005 游标的应用

    游标在SQL Server 2005中是一个关键特性,它允许用户按行处理查询结果集,这在处理大量数据或者需要逐行...在大多数情况下,通过优化查询和使用集合作业可以避免使用游标。但在特定场景下,游标仍然是必不可少的工具。

    SQL_SERVER游标最新详解[定义].pdf

    SQL Server中的游标是数据库操作中的一个重要工具,它允许用户逐行处理查询返回的结果集,提供了灵活的数据操作方式。游标本质上是一个从多条记录的结果...理解和掌握游标使用,可以帮助开发者更高效地与数据库交互。

    SQL游标

    在处理大量数据时,尽可能避免使用游标,而应优先考虑使用集合操作,如`INSERT INTO...SELECT`、`UPDATE`和`DELETE`等。然而,在某些情况下,比如需要逐行处理数据或者进行复杂条件判断时,游标是不可或缺的工具。 ...

    oracle游标介绍[定义].pdf

    Oracle游标是数据库管理系统中的一种重要机制,它允许程序逐行处理结果集,这对于交互式和在线...例如,如果游标操作涉及大量行,或者在游标循环中进行表连接,可能需要重新设计算法,以避免使用游标,提高程序效率。

    行业文档-设计装置-游标书签.zip

    在编写高效的SQL代码时,通常推荐尽可能避免使用游标,转而使用集合操作如JOINs和聚合函数。 6. **游标在设计装置中的应用**:在设计装置的上下文中,游标书签可能被用在数据可视化或数据分析软件中,帮助用户在...

    关于游标的说明与使用方法

    ### 关于游标的说明与使用方法 #### 一、什么是游标? 在数据库技术中,**游标**是一种用于检索查询结果集中的数据的方式。它允许用户逐行处理记录集,而不是一次处理整个记录集。这使得游标成为处理大量数据时的...

    在SQLSERVER2005下操作游标

    因此,除非确实需要,否则应尽量避免使用游标,尤其是动态游标,因为它们可能导致大量的表扫描。 7. **事务管理**: 当游标操作涉及修改数据时,确保将它们包含在一个事务中,以保持数据的一致性。例如: ```sql ...

    ORACLE 游标使用示例

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

Global site tag (gtag.js) - Google Analytics