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