Sql 使用数据库游标有什么好处?

Sql 使用数据库游标有什么好处?,sql,database,cursor,Sql,Database,Cursor,这是基于我面对的面试问题 可以使用非常短的定义 它可以用来操纵行 由查询返回 除了使用游标(点列在MSDN上),我还有一个问题,如果我们可以使用查询或存储过程执行所有操作(如果我没有错,比如我们可以使用Transact-SQL for ms SQL),那么我们应该使用游标吗?使用游标,您可以一次访问一行。因此,当您想要操纵很多行,但在给定的时间只有一行时,使用它是很好的 在我的课堂上,有人告诉我,使用游标的原因是你想访问的行数超过你的内存容量,所以你不能把所有的行都放到一个集合中,然后循环遍历它

这是基于我面对的面试问题

可以使用非常短的定义

它可以用来操纵行 由查询返回


除了使用游标(点列在MSDN上),我还有一个问题,如果我们可以使用查询或存储过程执行所有操作(如果我没有错,比如我们可以使用Transact-SQL for ms SQL),那么我们应该使用游标吗?

使用游标,您可以一次访问一行。因此,当您想要操纵很多行,但在给定的时间只有一行时,使用它是很好的


在我的课堂上,有人告诉我,使用游标的原因是你想访问的行数超过你的内存容量,所以你不能把所有的行都放到一个集合中,然后循环遍历它。

使用游标,可以通过编程方式顺序读取一组数据,因此,它的行为方式与传统的文件访问方式类似,而不是SQL基于集合的行为特征

在以下几种情况下,这可能有用:

  • 在需要模拟基于文件的记录访问行为的情况下-例如,关系数据库被用作一段代码的数据存储机制,该代码以前编写为使用索引文件进行数据存储

  • 在需要按顺序处理数据的情况下,一个简单的示例可能是计算特定客户的总余额。(许多关系数据库,如Oracle和SQLServer,现在都有对SQL的分析扩展,这将大大减少对这种扩展的需求。)


  • 不可避免地,维基百科还有更多的功能:

    游标是一种工具,允许您在一个集合中迭代记录。它有顺序和当前记录的概念

    通常,
    SQL
    使用多个集合进行操作:这些集合是可能重复的记录集合,没有给定的顺序,作为一个整体

    比如,这个查询:

    SELECT  *
    FROM    a
    JOIN    b
    ON      b.a = a.id
    
    ,在多集
    a
    b
    上运行

    此查询中没有对记录的顺序、存储方式、访问顺序等做出任何假设

    这允许抽象出实现细节,并让系统尝试选择最好的算法来运行此查询

    但是,在您转换了所有数据之后,最终需要以有序的方式逐个访问记录

    你不在乎电话簿的条目在硬盘上存储的准确程度,但打印机需要按字母顺序输入;格式标签应该分别应用于每个记录

    这正是光标发挥作用的地方。每次在客户端处理结果集时,您都在使用游标。您不会从服务器获取兆字节的未排序数据:您只需获取一个小变量:一个resultset描述符,然后编写如下内容:

    while (!rs.EOF) {
       process(rs);
       rs.moveNext();
    }
    
    这就是为您实现所有这些的游标

    这当然涉及数据库客户机交互

    至于数据库本身:在数据库内部,您很少需要游标,因为正如我上面所说的,几乎所有的数据转换都可以使用集合操作更有效地实现

    但是,也有例外情况:

    • SQL Server
      中的分析操作执行得非常糟糕。例如,与使用基于集合的操作相比,使用光标可以更有效地计算累积和
    • 分块处理数据。有些情况下,基于集合的操作应该顺序应用于集合的一部分,并且每个区块的结果应该独立提交。虽然仍然可以使用基于集合的操作来完成,但光标通常是更可取的方式
    • 本机不支持递归的系统中的递归
    您还可能会发现这篇文章值得一读:


    与大结果集相比,使用游标就像使用视频流,而不是一下子下载视频,下载后再观看。 如果你下载,你必须有一些空间和耐心等待,直到下载完成。现在,无论你的机器或网络有多快,每个人都以相同的速度观看电影

    通常,任何查询都会在一次突发活动中发送到服务器并执行,结果集通过网络发送给您。 光标将允许您逐行访问数据,并且仅当您请求时才对每一行进行流式处理(实际上可以查看它)

    • 光标可以节省时间,因为您不需要等待处理和下载完整的记录集

    • 它将节省服务器和客户端的内存,因为它们不必为结果集占用大量内存
    • 网络和服务器的负载平衡-在“突发”模式下工作通常效率更高,但它会完全阻塞服务器和网络。这种延迟对于多用户环境来说是不可取的。流式处理为其他操作留出了空间
    • 允许对查询表(在某些条件下)执行不会直接影响光标的操作。因此,当您将光标放在一行上时,其他进程可以读取、更新甚至删除其他行。这对非常繁忙的表、许多并发读写操作尤其有帮助
    然而,这给我们带来了一些警告:

    • 一致性:使用游标,您(通常)不会对数据的一致快照进行操作,而是对一行进行操作。因此,您的并发性/一致性/隔离性保证从整个数据库(ACID)下降到只有一行。通常,您可以通知DBMS您想要的并发级别,但如果您太挑剔(锁定comp)