有人告诉我,在设计存储过程时,基于集合的操作比基于游标的操作扩展得更好。
有人可以简要解释为什么会这样吗?
有人告诉我,在设计存储过程时,基于集合的操作比基于游标的操作扩展得更好。
有人可以简要解释为什么会这样吗?
尽可能简洁:
在关系数据库引擎中,所有操作(无论是否在存储过程中)通常都会*使用基于集合的逻辑更好地扩展,这仅仅是因为这些引擎针对执行基于集合的操作进行了优化。
对于引擎中的单个原子操作,无论它影响 1 行还是 1,000,000 行,通常都有固定的资源成本(可能相当高)。
游标会产生更高的成本,因为数据库引擎必须在原子操作成本之上维护游标的状态。
*将有一些边缘情况/问题类别(具体取决于您的 RDBMS),其中过程逻辑将比基于集合的逻辑执行得更好。
所有(或几乎所有)RDMS 都针对基于集合的操作进行了优化,而不是基于行的操作。在大多数情况下,基于集合的解决方案优于基于行的解决方案。例如,evenSELECT * FROM table1
的执行速度比使用游标执行相同操作快很多倍。但是,在某些情况下,游标解决方案的性能更好。例如,在某些 RDMS(即 SQLServer 2005)中使用基于集合的方法计算运行聚合涉及多次重新扫描数据,而基于游标的方法只执行一次。
需要使用游标的另一种情况是应用程序的业务逻辑要求您单独处理每一行。