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

前端之家收集整理的这篇文章主要介绍了sql-server – 游标有什么问题?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
除了在某些情况下,sql Server开发人员认为游标是一种不好的做法.他们认为,游标不会最佳地使用sql引擎,因为它是一个程序性的构造,并且击败了基于Set的RDBMS概念.

但是,Oracle开发人员似乎并不推荐使用光标. Oracle的DML语句本身是隐式游标.

为什么这种差异的方法?是因为这两种产品的制造方式,还是这种建议适用于这两种产品?

解决方法

游标出现的问题是在Oracle和MS sql中都经常被滥用.

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

当然,保留这样的结果集需要一些资源:锁,锁存器,内存,甚至磁盘空间.

这些资源越快越好.

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

你不要在几个小时没有必要,但这并不意味着你不应该打开你的冰箱.

这意味着:

>你不会逐行得到结果,并且总结出来:你调用sql的SUM.
>您不执行整个查询并从游标获取第一个结果:您将rownum< = 10条件附加到查询
等等

对于Oracle,在一个过程中处理你的游标需要臭名昭着的sql / PLsql上下文切换,每当你从游标中得到SQL查询的结果时,它就会发生.

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

这是Oracle中最令人激动的事情之一.

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

创建触发器并调用DML函数等于打开游标,选择更新的行并为该游标的每一行调用触发器代码.

触发器的存在(甚至是空触发器)可能会减慢DML操作10次或更多次.

10g上的测试脚本:

  1. sql> CREATE TABLE trigger_test (id INT NOT NULL)
  2. 2 /
  3.  
  4. Table created
  5.  
  6. Executed in 0,031 seconds
  7. sql> INSERT
  8. 2 INTO trigger_test
  9. 3 SELECT level
  10. 4 FROM dual
  11. 5 CONNECT BY
  12. 6 level <= 1000000
  13. 7 /
  14.  
  15. 1000000 rows inserted
  16.  
  17. Executed in 1,469 seconds
  18. sql> COMMIT
  19. 2 /
  20.  
  21. Commit complete
  22.  
  23. Executed in 0 seconds
  24. sql> TRUNCATE TABLE trigger_test
  25. 2 /
  26.  
  27. Table truncated
  28.  
  29. Executed in 3 seconds
  30. sql> CREATE TRIGGER trg_test_ai
  31. 2 AFTER INSERT
  32. 3 ON trigger_test
  33. 4 FOR EACH ROW
  34. 5 BEGIN
  35. 6 NULL;
  36. 7 END;
  37. 8 /
  38.  
  39. Trigger created
  40.  
  41. Executed in 0,094 seconds
  42. sql> INSERT
  43. 2 INTO trigger_test
  44. 3 SELECT level
  45. 4 FROM dual
  46. 5 CONNECT BY
  47. 6 level <= 1000000
  48. 7 /
  49.  
  50. 1000000 rows inserted
  51.  
  52. Executed in 17,578 seconds

1.47秒没有触发,17.57秒用空触发器什么也没做.

猜你在找的MsSQL相关文章