jon*_*ers 39 sql t-sql sql-server cursor
很多时候,当我编写存储过程等时,我首先使用CURSOR,然后在我的程序中发现一些性能问题.
我读到的每一件事都说CURSORS很糟糕,造成不必要的锁定等等,性能测试证明是一样的.
我的问题是你什么时候使用CURSOR,在什么情况下它们有用或好?
如果没有用,为什么他们会为SQL做出如此差的控制结构/类型?
HLG*_*GEM 36
通常它们应该被避免,但是这个特征是有原因的,并且有时候使用它们.我说90%以上的游标我都不需要.如果您将它们用于CRUD操作,那么几乎总是可以以基于集合的方式重做.我经常看到人们使用游标,因为他们不知道如何在更新或删除中使用联接,或者他们可以使用选择语句而不是插入中的值子句.当人们认为他们需要稍微复杂的处理时,另一个不必要的用途,实际上可以通过case语句轻松处理.
游标有时可以更快地计算像运行总计一样的东西.
游标对于存储过程的多次执行也很方便,该过程被设置为一次只处理一个输入值.我不使用此功能来运行用户存储过程(除非我知道我将访问一小组数据)但是当需要针对多个表运行系统过程时,它对于数据库管理员来说非常方便.
如果您在SQl中创建电子邮件(不是最好的地方,但在某些系统中,他们这样做)并且不希望电子邮件的所有受众看到列表中的其他人或您想要个性化每个有关收件人的信息的电子邮件,游标是要走的路.
如果整个基于集的插入/更新/删除将花费太长时间并锁定表,则游标或循环也可用于处理批记录.这是游标和基于集合的解决方案之间的混合体,通常是生产系统上大变化的最佳选择.
我曾经问过SQL Server团队中的一个人,如果你能添加一个可以让产品更好的产品,那会是什么呢?
他的回答是'添加?嗯,我会带走一个.如果你摆脱游标,你就会迫使世界各地的程序员开始以基于SET的方式思考问题,这将是你将看到的全球范围内最大的数据库性能提升.
然而,就我而言,我倾向于看到一个模式,似乎有很多程序编码器使用游标,因为他们需要能够一次操作一个元素并错过旧时尚WHILE循环概念.没有光标开销的相同基本想法.仍然没有像基于SET那样快速/有效,但有90%的时候,当有人声称'我不能做这个基础时,我必须使用游标'我可以让他们用一个循环来做它.