首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在SQL Server中使用游标被认为是不好的做法?

在SQL Server中,游标被认为是不好的做法,主要原因是性能较低。游标是一种逐行处理数据的方法,它在执行过程中需要在服务器和客户端之间传递大量的数据,这会导致性能下降。

相比之下,集合操作(如SELECT、UPDATE、DELETE等)通常具有更高的性能,因为它们可以一次性处理整个数据集,而不是逐行处理。

此外,游标还可能导致锁定问题,因为它们需要在处理过程中保持数据锁定状态。这可能会导致其他用户无法访问或修改数据,从而影响数据库性能。

如果需要逐行处理数据,可以使用其他方法,如表值函数(Table-Valued Functions)或开放式数据服务(Open Data Services)等。这些方法可以提高性能,并减少锁定问题的风险。

总之,在SQL Server中使用游标被认为是不好的做法,因为它们通常会导致性能下降和锁定问题。如果需要逐行处理数据,应该使用其他方法来实现。

相关搜索:为什么省略花括号被认为是一种不好的做法?在objective-c/cocoa框架中编写c代码被认为是不好的做法?为什么在html中使用<main>标签被认为是很好的做法?使用.htaccess将url映射到处理程序被认为是不好的做法吗?在React Native中使用固定数字设置高度和宽度是否被认为是不好的做法?在没有实体主体的情况下执行HTTP POST被认为是不好的做法吗?使用查询字符串键/val对作为路由机制是否被认为是不好的做法?在SQL表中不断更改行是否被认为是一种糟糕的做法?在没有使用者的情况下使用contexProvider会被认为是不好的做法吗?在Oracle中删除不存在的记录被认为是不好的形式?在构造函数中使用原始指针并打算立即将其包装在智能指针中,这被认为是不好的做法吗?使用try/finally try/except而不是begin/end被认为是一种不好的做法或存在任何缺点?为什么在Dart中使用没有类型的final被认为是很好的做法?即` `final foo = config.foo;`?在xaml中,使用框架,在窗口内显示页面是不好的做法?在SQL Server 2017中,使用游标根据表中的参数值运行存储过程为什么在C++的函数中创建对象是一种不好的做法?为什么在Flutter/Android客户端上使用FCM服务器密钥是不好的做法?为什么在类属性中没有复杂的逻辑被认为是最佳实践?使用临时表将SQL SERVER中的代码转换为使用游标的Oracle PLSQL为什么在一个请求中建立多个数据库连接是不好的做法?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • MySQL 游标学习及使用实例

    (为什么要学习游标) 游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作; 它还提供对基于游标位置而对表中数据进行删除或更新的能力;...SERVER 支持三种类型的游标:Transact_SQL 游标,API服务器游标和客户游标。...(3)客户游标   客户游标主要是当在客户机上缓存结果集时才使用。在客户游标中,有一个缺省的结果集被用来在客户机上缓存整个结果集。客户游标仅支持静态游标而非动态游标。...由于API 游标和Transact-SQL 游标使用在服务器端,所以被称为服务器游标,也被称为后台游标,而客户端游标被称为前台游标。在本章中我们主要讲述服务器(后台)游标。...游标的分类 根据游标检测结果集变化的能力和消耗资源的情况不同,SQL Server支持的API服务器游标分为一下4种: 静态游标 : 静态游标的结果集,在游标打开的时候建立在TempDB中,不论你在操作游标的时候

    2.2K10

    提供6种优化的方案!

    在MySQL的limit中:limit 100,10MySQL会根据查询条件去存储引擎层找到前110条记录,然后在server层丢弃前100条记录取最后10条这样先扫描完再丢弃的记录相当于白找,深分页问题指的就是这种场景...,在二级索引上找到满足查询条件age=18的前5010条记录(或者直到不满足age=18),然后舍弃前5000条,取最后10条在这个过程中:先查二级索引接着回表获取完整记录然后返回给server层再查下一条记录由于二级索引是联合索引...,又或者偏移量还是太大的情况,我们还是需要使用其他的方案游标分页为了避免limit中的偏移量,可以自己来存储该偏移量我们可以使用上次查询的最大值来当作这次的查询条件(游标分页)-- 12.899sselect...SQL中会使用二级索引 idx_seat_code (seat_code,seat_id),当使用二级索引时,由于seat_code是等值查询,满足条件时id是有序的如果是原来的SQL使用这种做法会导致查询出来的结果不一致...,但需要使用二级索引定位且满足条件后主键值有序in + 子查询在游标分页与子查询使用二级索引定位的场景中总是需要记录偏移量的列(主键)有序,遇到无序的场景还需要排序,增加性能开销有没有更好的办法避免排序呢

    55222

    SQL 简易教程 下

    在MariaDB、MySQL和Oracle中创建占位符,可使用SAVEPOINT语句。 提示:保留点越多越好可以在SQL代码中设置任意多的保留点,越多越好。为什么呢?...SQL 游标 有时,需要在检索出来的行中前进或后退一行或多行,这就是游标的用途所在。...游标(cursor)是一个存储在DBMS服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。...使用游标涉及几个明确的步骤。 ❑ 在使用游标前,必须声明(定义)它。这个过程实际上没有检索数据,它只是定义要使用的SELECT 语句和游标选项。 ❑ 一旦声明,就必须打开游标以供使用。...这个过程用前面定义的 SELECT 语句把数据实际检索出来。 ❑ 对于填有数据的游标,根据需要取出(检索)各行。 ❑ 在结束游标使用时,必须关闭游标,可能的话,释放游标(有赖于具体的DBMS)。

    2.1K10

    【DB笔试面试587】在Oracle中,常规游标共享和自适应游标共享的联系和区别有哪些?

    ♣ 题目部分 在Oracle中,常规游标共享和自适应游标共享的联系和区别有哪些? ♣ 答案部分 从严格意义上来说,常规游标共享和自适应游标共享是各自独立的,两者之间没有必然的联系。...常规游标共享的目的是通过使用系统产生的绑定变量替换目标SQL的SQL文本中的具体输入值,以达到在不改一行应用代码的情况下,使那些仅仅是SQL文本的WHERE条件或者VALUES子句(适用于INSERT语句...在Oracle 11g中,对于使用了绑定变量的目标SQL而言,不管这个绑定变量是该SQL自带的还是开启常规游标共享后系统产生的,只要满足一定的条件(比如绑定变量窥探被开启,该SQL中使用的绑定变量的数量不超过...例如,如果参数CURSOR_SHARING的值为EXACT,那么必须在目标SQL使用自定义的绑定变量后自适应游标共享才能生效;而当参数CURSOR_SHARING的值为FORCE时,即使目标SQL没有使用自定义的绑定变量...在自适应游标共享被开启的情况下,Oracle并不推荐将CURSOR_SHARING的值设为SIMILAR,因为当把CURSOR_SHARING的值设为SIMILAR后,对自适应游标共享可能有不好的影响,

    58910

    SQL Server优化50法

    游标的技术在SQL2000下变得功能很强大,他的目的是支持循环。有四个并发选项: READ_ONLY:不允许通过游标定位更新(Update),且在组成结果集的行中没有锁。...在 SQL Server 中,这个性能由 timestamp 数据类型提供,它是一个二进制数字,表示数据库中更改的相对顺序。每个数据库都有一个全局当前时间戳值:@@DBTS。...每次以任何方式更改带有 timestamp 列的行时,SQL Server 先在时间戳列中存储当前的 @@DBTS 值,然后增加 @@DBTS 的值。...在悲观并发控制中,在把数据库的行读入游标结果集时,应用程序将试图锁定数据库行。在使用服务器游标时,将行读入游标时会在其上放置一个更新锁。...存储过程是编译好、优化过、并且被组织到一个执行规划里、且存储在数据库中的SQL语句,是控制流语言的集合,速度当然快。反复执行的动态SQL,可以使用临时存储过程,该过程(临时表)被放在Tempdb中。

    2.1K70

    MySQL 8.0 DDL 导致数据丢失问题分析

    重建过程中由于 DDL 缓冲区不足,需要暂存游标状态 4. 暂存游标指向的行恰好是已删除记录 5. 该游标指向的该行记录在恢复前被 purge 线程清理 6....恢复后游标位置错位,导致跳过一条记录 触发逻辑:先对表删除一条或一批记录,然后立即重建表,重建表过程中,由于ddl buffer不够,需要暂存当前游标状态,清空ddl buffer后再继续,如果游标指向的前一行恰好是被标记为...deleted的记录,且这条记录在游标恢复前被purge线程清理,将导致恢复后的游标指错位置,跳过一条记录,最终丢失该条被跳过记录。...在重建TABLE操作时,使用Online DDL的能力来完成该行为,过程中扫描原始表,将记录添加到innodb_ddl_buffer_size缓冲区,并使用一个游标(PCursor)来存储待拷贝数据的位置...c,补偿save时的向前一步 } } 关键点:补偿了游标––savepoint时指向前一行,在resume中向后指一行,最终游标仍然指向当前处理行c。

    8710

    mysql查询缓慢原因和解决方案

    游标的技术在SQL2000下变得功能很强大,他的目的是支持循环。有四个并发选项 READ_ONLY:不允许通过游标定位更新(Update),且在组成结果集的行中没有锁。...在 SQL Server 中,这个性能由 timestamp 数据类型提供,它是一个二进制数字,表示数据库中更改的相对顺序。每个数据库都有一个全局当前时间戳值:@@DBTS。...每次以任何方式更改带有 timestamp 列的行时,SQL Server 先在时间戳列中存储当前的 @@DBTS 值,然后增加 @@DBTS 的值。...在悲观并发控制中,在把数据库的行读入游标结果集时,应用程序将试图锁定数据库行。在使用服务器游标时,将行读入游标时会在其上放置一个更新锁。...存储过程是编译好、优化过、并且被组织到一个执行规划里、且存储在数据库中的SQL语句,是控制流语言的集合,速度当然快。反复执行的动态SQL,可以使用临时存储过程,该过程(临时表)被放在Tempdb中。

    3.3K30

    8.优化存储过程的性能(810)

    优化存储过程的性能 1.引言 存储过程是数据库系统中预先编写好的SQL语句集合,它们被保存在数据库服务器上,可以在需要时被调用执行。...动态管理视图(DMVs):在SQL Server中,DMVs提供了实时的、内部的数据库状态信息,可以用来监控数据库的运行状况和性能。...动态管理视图(DMVs):在SQL Server中,DMVs提供了实时的、内部的数据库状态信息,可以用来监控数据库的运行状况和性能。...Username = @Username; 在某些数据库中,如SQL Server,你还可以使用sp_executesql来执行参数化查询,这有助于提高性能,因为它允许查询计划的重用。...未使用参数化查询: 直接将用户输入拼接到查询中,而不是使用参数化查询,这可能导致SQL注入攻击。 过度使用游标: 游标可以逐行处理结果集,但它们通常比集合操作更慢。

    17610

    sql server T-SQL 基础

    一、T-SQL语法基础 1.标识符 在SQL Server中,标识符就是指用来定义服务器、数据库、数据库对象和变量等的名称。...3.变量 在SQL Server中,变量分为局部变量和全局变量 1)局部变量     前面有一个@字符,由用户定义和使用。 2)全局变量     名称前面有两个@字符,由系统定义和维护。...Server的各种状态信息,它们不能被显示地赋值或声明,而且不能被用户定义。...< ^(按位异或)、&(按位与)、|(按位或) NOT AND ALL、ANY、BETWEEN、IN、LIKE、OR、 =(赋值) 5.流程控制语句 控制流语句是用来控制程序执行流程的语句,使用控制流语句可以在程序中组织语句的执行流程...7.游标的使用 游标包括以下两个部分: ①游标结果集  定义该游标的SELECT语句返回的行的集合。 ②游标位置  指向这个集合中某一行的指针。 游标的典型使用过程 : ?

    2.1K60

    SQL Server通过创建临时表遍历更新数据

    (线上数据库用是SQL Server2012)关于数据统计汇总的问题肯定会用到遍历统计汇总,那么问题来了数据库中如何遍历呢?...为什么不使用游标,而使用创建临时表?   ...首先使用游标的方式遍历数据可能代码上比较直观,但是代码比较繁琐(声明游标,打开游标,使用游标,关闭游标和释放游标)并且不符合操作集合的原则,而且也非常的耗费性能,因此通常数据量比较大的情况下不推荐使用游标...通过临时表while遍历数据,更符合我们日常的编程思想操作集合原则,性能上虽不敢保证表使用游标要好多少,但是在把临时表使用恰当的前提是能减少大量的性能消耗,并且使用起来非常简单易懂。...临时表遍历更新SQL语句: ----SQL SERVER通过临时表遍历数据 -- 判断是否存在(object(‘objectname’,‘type’)) IF OBJECT_ID('tempdb.dbo

    2.3K20

    程序员与数据库中的设计

    不尽量避免游标的使用,通篇的游标+ 循环(还是在内部) 4 一堆的 if else if else ,仿佛进入了迷宫 5 在插入的端口,进行极为复杂的TRIGGER 设计 终上所述,陷入了一个怪圈,...2 INSERT 请就好好的INSERT INSERT INTO 在大型系统里面不应该被存在,如何处理见上 3 游标,如果实在没有办法,那就用,不频繁使用没问题,否则祈求,客户别投诉。...那存储过程里面为什么要存在临时表,原因如下 , 1 复杂的多表查询中,数据库的优化引擎在牛B ,他也有算错的时候,无论是因为统计数据的错,还是语句写法的错,复杂的查询,如果变成多个简单的查询,都是没有坏处的...所以在大型系统中,请尽量将操作DML的操作与 SELECT 的操作分开,不要insert select , update select ,这样不好,也容易带来更多的问题,和复杂的锁。...以上言论只针对,SQL SERVER , ORACLE ,PG , --- MYSQL 不在此讨论范围

    57820

    70-根因分析-oracle数据库突发性能问题,谁来背这个锅

    这也是为什么很多对业务稳定性要求非常高的行业(比如金融、通信、铁路、航空等)的数据库系统,购买oracle 售后高服(ACS)中的顶级服务SSC服务的一个主要原因。...这里面涉及到一个重要的开发规范相关内容:非常不建议用number或varchar2类型保存日期数据,规范做法是使用date类型。上面数据类型随意使用的做法是开发人员为了少敲几个字母的偷懒行为。...这种偷懒的不规范做法,会给SQL性能带来较大的性能隐患。...5、知识点5:发生谓词越界后,数据库优化器在评估这个sql可以使用的两个索引(都是以越界字段开头的组合索引)时,就不是常规的选择方式,而是选择leaf blocks较少的那一个,这个案例,leaf blocks...,#2对应上面的低效索引: 6、知识点6:sqlhc捕获到了sql后面的一些执行情况,很多使用的绑定变量已经不再越界,而且系统的自适应游标(ACS)保持开启状态,为什么ACS没能及时把执行计划调整回正常

    88610

    SQL岗位30个面试题,SQL面试问题及答案「建议收藏」

    DBMS是一个控制数据维护和使用的程序,它被认为是管理数据的文件管理器。...· ForeignKey(外键)——在一个表中定义主键并在另一个表中定义字段的键被标识为外键。...例如使用一组规则存储的字符数据,这些规则定义了正确字符的序列以及类型、重音和区分大小写。 什么是Cursor(游标)? 在系统内存中执行SQL语句时,会创建一个临时工作区,称为“游标”。...在select语句中,游标存储了信息。游标可以使用多行,但一次只能处理一行。这组行称为活动集。...游标有两种类型: · ImplicitCursor(隐式游标) · ExplicitCursor(显式游标) 什么是SQL Server?

    4.5K31

    DECLARE在SQL中的用法及相关等等

    变量是在批处理或过程的主体中用 DECLARE 语句声明的,并用 SET 或 SELECT 语句赋值。游标变量可使用此语句声明,并可用于其他与游标相关的语句。...在表中添加新行时,SQL Server 将为列提供一个唯一的增量值。标识列通常与 PRIMARY KEY 约束一起用作表的唯一行标识符。...在所有上述语句中,如果存在被引用的游标变量,但是不具有当前分配给它的游标,那么 SQL Server 将引发错误。...如果不存在被引用的游标变量,SQL Server 将引发与其他类型的未声明变量引发的错误相同的错误。 游标变量: * 可以是游标类型或其他游标变量的目标。...* 应被看作是指向游标的指针。有关游标变量的详细信息,请参阅 Transact-SQL 游标。 示例 A.

    2.9K20

    数据库DNSLog外带注入-总结

    sql注入中利用的骚姿势你又知道几个? DNSLog外带注入和DNSlog带外注入?(OOB) 其实是一样的,叫法不同!...UNC是一种命名惯例, 主要用于在Microsoft Windows上指定和映射网络驱动器, UNC命名惯例最多被应用于在局域网中访问文件服务器或者打印机....PostgreSQL数据类型中的text,实际上是一个长度不受限制的字符串,就像 varchar 一样,只是不需要定义最大长度。这是一个 PostgreSQL 针对 SQL 标准做的扩展。...使用预处理语句被认为是最安全的预防措施,处理语句能在SQL命令被插入的时候确保查询的意图不被攻击者改变,但像magic_quote()和addslashes()那样的各种禁制机制并不能完全防止SQLI漏洞的存在或利用...,因为在某些技术配合使用的环境条件下,攻击者仍能利用该漏洞。

    3.8K20

    SQL游标(cursor)详细说明及内部循环使用示例

    我们知道关系数据库管理系统实质是面向集合的,在MS SQL SERVER 中并没有一种描述表中单一记录的表达形式,除非使用where 子句来限制只有一条记录被选中。...(3)客户游标 客户游标主要是当在客户机上缓存结果集时才使用。在客户游标中,有一个缺省的结果集被用来在客户机上缓存整个结果集。客户游标仅支持静态游标而非动态游标。...由于API 游标和Transact-SQL 游标使用在服务器端,所以被称为服务器游标,也被称为后台游标,而客户端游标被称为前台游标。在本章中我们主要讲述服务器(后台)游标。...分类 根据游标检测结果集变化的能力和消耗资源的情况不同,SQL Server支持的API服务器游标分为一下4种: 静态游标 : 静态游标的结果集,在游标打开的时候建立在TempDB中,不论你在操作游标的时候...如果使用API函数或T-SQL Where Current of子句通过游标进行更新,他们将立即可见。在游标外部所做的更新直到提交时才可见。

    2.2K30
    领券