gpt4 book ai didi

sql-server - 游标有什么问题?

转载 作者:行者123 更新时间:2023-12-02 07:35:00 26 4
gpt4 key购买 nike

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

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

为什么会出现这种方法上的差异?是因为这两种产品的制作方式不同,还是该建议适用于这两种产品?

最佳答案

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

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

当然,保存这样的结果集需要一些资源:locks , latches , memory ,甚至 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空触发器不执行任何操作的秒数。

关于sql-server - 游标有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/743183/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com