- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近有一个关于在 TSQL 中使用游标的争论......
首先,我不是辩论中的啦啦队长。但是每次有人说 cursor 时,总会有一些笨蛋(或 50 个)用强制性的“光标是邪恶的”咒语来猛扑。我知道 SQL-Server 已针对基于集合的操作进行了优化,也许游标确实是邪恶的化身,但如果我想在其背后放一些客观的想法......
这是我的想法:
1) 游标和集合操作之间的唯一区别是 性能 之一吗?
编辑 :有一个很好的例子,因为它不仅仅是一个性能问题——例如反复运行单个批处理来获取 id 列表,或者执行存储在表字段中的实际 SQL 文本逐行。
2) 跟进:游标 总是 表现更差吗?
编辑 :@Martin 展示了一个很好的案例,其中游标的性能相当显着地优于基于集合的操作。我怀疑这不会是你经常做的事情(在你诉诸某种 OLAP/数据仓库类型的解决方案之前),但尽管如此,这似乎是一个你真的不能没有的情况一个游标。
- reference to TPC benchmarks 暗示游标可能比人们普遍认为的更具竞争力。
- reference to memory-usage optimizations 自 Sql-Server 2005 起用于游标
3) 有没有你能想到的问题,游标比基于集合的操作更适合解决?
编辑 :基于集合的操作实际上不能 Execute
存储过程等(请参阅上面第 1 项的编辑)。
编辑 :在聚合大型数据集时,基于集合的操作比逐行慢。
最佳答案
直接回答您的问题:
我还没有遇到过这样的情况,即设置操作无法完成其他情况下可以用游标完成的操作。但是,在某些情况下,使用游标将大型集合问题分解为更易于管理的块证明是出于代码可维护性、日志记录、事务控制等目的的更好解决方案。但我怀疑是否有任何硬性规定可以告诉您哪种类型的需求会导致一种解决方案或另一种解决方案——单个数据库和需求简直太多样化了。
也就是说,我完全同意你的“如果它没有坏,就不要修理它”的方法。通过重构过程代码来为运行良好的过程设置操作,几乎没有什么好处。但是,首先寻求基于集合的解决方案是一个很好的经验法则,只有在必须时才使用过程代码。直觉?如果您使用游标的时间超过 20%,那么您就做错了。
而我真正想说的是:
当我面试程序员时,我总是向他们抛出一些中等复杂的 SQL 问题,并要求他们解释他们将如何解决这些问题。我知道这些问题可以通过集合操作来解决,我特别在寻找能够在没有过程方法(即游标)的情况下解决这些问题的候选人。
这并不是因为我相信任何一种方法都有本质上好的或更高的性能——不同的情况会产生不同的结果。而是因为,根据我的经验,程序员要么获得基于集合的操作的概念,要么没有。如果他们不这样做,他们将花费太多时间为可以通过基于集合的操作更快更简单地解决的问题开发复杂的程序解决方案。
相反,获得基于集合的操作的程序员几乎不会在实现过程式解决方案时遇到问题,而这确实是绝对必要的。
关于tsql - 什么时候 TSQL 游标是最好的或唯一的选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6877507/
CREATE TABLE [dbo].[tblLocations]( [latitude] [float] NOT NULL, [longitude] [float] NOT NULL
有没有办法在相似的表中递归读取记录并按深度级别排序? #table: id int | parent int | value string --------------------
尝试从旧数据库迁移到存储数据的新数据库有点不同。 在一种特定情况下,我有一列用分号分隔的值,我想将其分隔成多行。 这是一个例子: SELECT p.idperson, p.rolepe
我用谷歌搜索并查看了 MSDN TSQL 引用,但无法找到“ .. ”的含义或作用的定义或解释。 示例 if OBJECT_ID('tempdb..#temp') is not null drop t
我需要以下内容: 检查 Public 或 guest 是否被授予对对象(数据库角色和服务器角色)的任何权限 检查是否有任何用户被授予对对象而非角色的权限。 检查用户是否对对象 拥有 with gran
DECLARE @query as varchar(200); SET @query = 'SELECT COUNT(*) FROM table'; 如何执行@query,此外,在分配变量时是否可以直
我正在编写报告,并希望获取年龄列的平均值。问题在于,并非所有行都具有年龄。 如果该列的值为0 2 4,我希望返回3,而不是2。我不能简单地使用WHERE排除零行,因为我正在使用那些行中的其他列。是否存
我尝试在 tsql 中左修剪换行符。所以我想删除领先的 字符(13) + 字符(10) 我在一个字段中的数据。并确保不会删除其他换行符。 我的意思是: ' Kanne Oliver Rosa-Luxe
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How to execute mathematical expression stored in a var
我认为最好以简单示例的形式提出这个问题。以下 SQL 块会导致“DB-Library Error:20049 Severity:4 Message:Data-conversion导致溢出”消息,但怎么
我们的一位用户在开发服务器中执行了插入语句。插入工作正常。但是在生产服务器执行同样的insert语句时,却遇到了如下错误: Error:.Net SqlClient Data Provider Err
我如何编写 TSQL 来计算以下内容: 当前日期和午夜,例如 2010-12-01 00:00:00.000 当前日期和下午 6 点,例如 2010-12-01 18:00:00.000 谢谢.. 最
我最近有一个关于在 TSQL 中使用游标的争论...... 首先,我不是辩论中的啦啦队长。但是每次有人说 cursor 时,总会有一些笨蛋(或 50 个)用强制性的“光标是邪恶的”咒语来猛扑。我知道
是否可以在不显式定义列的情况下在 sql 中声明变量? 类似 declare @tab as select * from myTable 最佳答案 你可以选择一个临时表......看起来它会做你想要的
我们遇到的问题简化为以下两个语句: select convert(float, (convert(float,5741.61)/convert(float, 196.00)) * convert(fl
我有一个 ADO.NET/TSQL 性能问题。我们的应用程序中有两个选项: 1) 一个具有多个结果集的大型数据库调用,然后在代码中逐步遍历每个结果集并填充我的对象。这会导致一次到数据库的往返。 2)
问题背景 生成和访问固定列布局的数据很容易。您可以预先创建本地临时表,并通过调用存储过程来填充它们。 另一方面,如果要生成具有动态列布局的数据,通常必须动态构建 SQL 语句并使用“exec sp_e
我有一个SQL Server 2005查询,该查询生成较大的结果集(最大为数GB): SELECT * FROM Product FOR XML PATH('Product') 运行查询将生成包含包含
我使用此代码在 sql server 中读取 .mp3 文件字节。当我使用本地连接时,它工作正常。但是,当我更改与服务器的连接(例如: 192.168.1.1 和 windows 身份验证模式 )并运
这不会在 ColdFusion 11 中崩溃,但会在 ColdFusion 2016 中崩溃 SELECT * FROM dbo.Roles WITH (NOLOCK) WHERE Cod
我是一名优秀的程序员,十分优秀!