【发布时间】:2011-02-25 10:50:41
【问题描述】:
即席查询与存储过程与动态 SQL。谁能说说利弊?
【问题讨论】:
标签: sql stored-procedures dynamic-sql adhoc-queries
即席查询与存储过程与动态 SQL。谁能说说利弊?
【问题讨论】:
标签: sql stored-procedures dynamic-sql adhoc-queries
恕我直言,存储过程应该像瘟疫一样被避免。这里有十个很好的理由来说明为什么你永远不应该使用它们(适用于所有数据库):
只有一个地方我会批准它们的使用:对于非常特定的数据库功能 - 可能是密钥检查或数据类型转换或类似的东西,可能在触发器中,它非常重要,它证明了它的存在并且可能赢得了'一旦写完就永远不会改变。
一般来说,您应该从存储过程中运行尖叫!
【讨论】:
存储过程
动态 SQL(即在存储过程中使用 exec 命令)
Ad Hoc SQL(即在您的业务代码中创建)
注意:始终参数化您的即席 SQL。
对于 OLAP ad hoc SQL:仅参数化字符串数据。这满足两个条件。它可以防止 SQL 注入攻击。它使查询看起来对数据库更加独特。是的,你会得到一个很差的查询计划缓存命中率。但这对于 OLAP 查询来说是可取的。他们受益于独特的计划生成,因为他们的数据集和最有效的计划在给定参数之间变化很大。
【讨论】:
另一个优势是更容易“无停机升级”(对于重大升级,您仍然可能会导致一些停机时间)。
如果所有数据访问都通过存储过程完成,您可以轻松地让 v1 和 v2 的存储过程并排放置。
现在您可以同时运行来自 v1 和 v2 的二进制文件/应用程序逻辑,每个都调用自己的存储过程版本。
通过 1、将 v1 应用程序锁定为只读模式(如果适用)、2、部署数据库更改来实现无停机时间。 3,重新启用对 v1 应用程序的正常访问,4,并排部署 v2 应用程序,告诉新用户使用新的二进制文件。 6. 当没有更多用户使用旧的二进制文件时,关闭旧的二进制文件。
【讨论】:
关系数据库管理系统?此答案特定于旧版 oracle
在旧的 oracle 版本
【讨论】:
存储过程 PRO:
存储过程的缺点:
【讨论】:
存储过程
临时和动态 - 请参阅 Bill Paetzke 的答案和 cmets。
此外,不要忘记诸如 SQL 的批量插入之类的模式,这些模式不在您的列表中,但仍应予以考虑。
【讨论】: