游标有什么问题 (what is wrong)

SQL Server 开发人员认为游标是一种不好的做法,除非在某些情况下。他们认为游标不能最佳地使用 SQL 引擎,因为它是一个过程构造,并且违背了基于集合的 RDBMS 概念。

SQL Server 开发人员认为游标是一种不好的做法,除非在某些情况下。他们认为游标不能最佳地使用 SQL 引擎,因为它是一个过程构造,并且违背了基于集合的 RDBMS 概念。

但是,Oracle 开发人员似乎不建议使用游标。Oracle 的 DML 语句本身就是隐式游标。

为什么会有这种差异?是因为这两种产品的制造方式,还是这两种产品都适用?

22

游标的问题在于它们经常被滥用,无论是在Oracle还是在MS SQL中。

游标用于保持稳定的结果集,您可以逐行检索。它们是在运行查询时隐式创建的,并在查询完成时关闭。

当然,保持这样的结果集需要一些资源:lockslatchesmemory,甚至disk space

释放这些资源的速度越快越好。

保持光标打开就像保持冰箱门打开一样

你不会在没有必要的情况下做几个小时,但这并不意味着你永远不应该打开冰箱。

这意味着:

您不会逐行获得结果并对其求和:您调用SQLSUM

您不执行整个查询并从游标中获得第一个结果:您将rownum <= 10条件附加到您的查询

等。

对于Oracle,在过程中处理游标需要臭名昭著的SQL/PLSQL context switch,每次从游标中得到SQL查询的结果时都会发生这种情况。

它涉及在线程之间传递大量数据并同步线程。

这是Oracle中最令人恼火的事情之一。

这种行为的一个不太明显的后果是,如果可能的话,应该避免 Oracle 中的触发器。

创建触发器并调用DML函数等于打开光标选择更新的行并为此光标的每一行调用触发器代码。

触发器(即使是空触发器)的存在可能会减慢DML操作10 times或更多。

10g上的测试脚本:

SQL> CREATE TABLE trigger_test (id INT NOT NULL)
  2  /
Table created
Executed in 0,031 seconds
SQL> INSERT
  2  INTO   trigger_test
  3  SELECT level
  4  FROM   dual
  5  CONNECT BY
  6     level <= 1000000
  7  /
1000000 rows inserted
Executed in 1,469 seconds
SQL> COMMIT
  2  /
Commit complete
Executed in 0 seconds
SQL> TRUNCATE TABLE trigger_test
  2  /
Table truncated
Executed in 3 seconds
SQL> CREATE TRIGGER trg_test_ai
  2  AFTER INSERT
  3  ON trigger_test
  4  FOR EACH ROW
  5  BEGIN
  6     NULL;
  7  END;
  8  /
Trigger created
Executed in 0,094 seconds
SQL> INSERT
  2  INTO   trigger_test
  3  SELECT level
  4  FROM   dual
  5  CONNECT BY
  6     level <= 1000000
  7  /
1000000 rows inserted
Executed in 17,578 seconds

1.47秒,无触发器,17.57秒,空触发器不执行任何操作。

14
FromMSDN:Cursor Implementations

使用游标比使用默认结果集效率低。在默认结果集中,从客户端发送到服务器的唯一数据包是包含要执行的语句的数据包。使用服务器游标时,每个 FETCH 语句必须从客户端发送到服务器,在服务器中必须对其进行解析并编译为执行计划。

如果 Transact-SQL 语句将返回可缓存在客户端应用程序可用的内存中的相对较小的结果集,并且在执行该语句之前知道必须检索整个结果集,请使用默认结果集。仅当需要游标操作来支持应用程序的功能时,或者只有部分结果集可能被检索时,才使用服务器游标。

我不是 Oracle DBA,所以我不能真正说出实现的不同。但是,从编程的角度来看,基于集合的操作几乎总是比游标中的处理结果快。

3

我一直被告知游标在哪里,但总是由 MS SQL Server 大师,因为它的性能不好。关于 Oracle 的 PL / SQLI found this saying when to use cursors

不使用游标会导致重复解析。如果不使用绑定变量,则会对所有 SQL 语句进行硬解析。这对性能有一个数量级的影响,并且完全不可扩展。将游标与绑定变量一起使用会打开游标并执行多次。怀疑生成动态 SQL 的应用程序。

作为cursors are implicitly createdon every operation,在需要时使用它们似乎并没有那么性能上的惩罚:)

请记住,Oracle 的实现更接近 Postgres 而不是 Sybase(MS SQL Server 的 Genesis),因此在不同的任务上,每个任务的性能都会有所不同。如果可以的话,请避免在可以交换后端的系统上进行性能调整,如果需要同时使用两者,请选择最小公分母。/ tangent_topic

1

我相信有人可以更详细地解释,但它基本上归结为 SQL 服务器中的游标是 SLOW。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(581)
如何检查字母在PHP中是上还是下
上一篇
Rsi指标源码:根据tradingview计算RSI指标
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(27条)