存储过程还是内联查询?

时间:2008-10-31 00:17:40

标签: sql stored-procedures subsonic

首先,有一个partial question关于此问题,但这并不是我所要求的,所以,请耐心等待。

我的问题是,在查看了SubSonic的内容以及Rob Connery的精彩视频后,我需要问一下:我们应该使用这样的工具进行内联查询还是查询使用调用存储过程?

我不想最大限度地减少Rob的任何工作(我认为这很棒)但我只是想要你对这个原因的看法我需要开始一个新的项目而且我处于中间位置;我应该使用SubSonic(或其他类似的工具,如NHibernate),或者我只是继续我的方法,即使它是一个简单的

也总是调用存储过程
Select this, that from myTable where myStuff = StackOverflow;

10 个答案:

答案 0 :(得分:2)

它不需要是一个或另一个。如果是简单查询,请使用SubSonic查询工具。如果它更复杂,请使用存储过程并加载集合或从结果中创建数据集。

请参见此处:What are the pros and cons to keeping SQL in Stored Procs versus Code和此处SubSonic and Stored Procedures

答案 1 :(得分:2)

查看答案herehere。我尽可能使用sprocs,除非繁文缛节意味着需要一周的时间才能进入数据库。

答案 2 :(得分:2)

当您有多个依赖于同一数据库的应用程序时,存储过程是黄金。它允许您定义和维护查询逻辑一次,而不是几个地方。

另一方面,存储过程本身很容易成为数据库中一个混乱的混乱,因为大多数系统没有一个很好的逻辑组织方法。而且他们可能更难以版本化和跟踪变化。

答案 3 :(得分:1)

我个人不会遵循严格的规则。当然,在开发阶段,您希望能够快速更改查询,以便内联它们。

稍后,我将转向存储过程,因为它们具有以下两个优点。我相信还有更多,但这两个让我赢了。

1 /存储过程将数据和代码分组,以便在一个点上操作/提取该数据。这使得DBA的生命变得更加容易(假设您的应用程序足够大,可以保证DBA),因为它们可以根据已知因素进行优化。

DBA的一个重要问题是即席查询(特别是那些不知道全表扫描是什么的小丑)。 DBA更喜欢具有可以将数据库调整到的良好的一致查询。

2 /存储过程可以包含最好留在数据库中的逻辑。我在DB2 / z中看到了存储过程有许多行,但是所有客户端必须编写代码就像“给我那个列表”一样。

由于“该列表”的逻辑存储在数据库中,因此DBA可以修改它的存储和提取方式,无需来破坏或更改客户端代码。这类似于封装,使面向对象的语言比以前更清晰。

答案 4 :(得分:1)

我已经完成了内联查询和存储过程的混合。我更喜欢存储过程/视图方法,因为它为您提供了一个很好的位置,可以根据需要进行更改。当您具有内联查询时,您始终必须更改代码以更改内联查询,然后重新滚动应用程序。您也可能在多个位置进行内联查询,因此您需要更改比使用一个存储过程更多的代码。

然后再次如果你必须向存储过程添加一个参数,你仍然会改变很多代码。

另一个注意事项是数据在存储过程后面的变化频率,在我工作的地方,我们有第三方表可能会分解为规范化表,或者表变得过时。在这种情况下,存储过程/视图可以最小化您对该更改的曝光。

我还编写了一个没有存储过程的整个应用程序。它有三个班级和10个页面,根本不值得。我认为有一点可以说是过度杀伤,或者可以说是合理的,但这也取决于你的个人观点和偏好。

答案 5 :(得分:0)

您是否只会从该应用程序访问您的数据库?

如果没有,那么您可能最好使用存储过程,这样您就可以拥有与数据库一致的接口。

如果您需要进行更改,分发您的应用程序是否有任何重大成本?

如果是这样,那么最好使用可以在服务器上更改的存储过程,并且不需要分发这些更改。

您是否一直关注数据库的安全性?

如果是这样,那么您可能希望使用存储过程,这样就不必授予用户对表的直接访问权。

如果您正在为一个不会在应用程序之外使用或访问的系统编写一个没有广泛受众的小应用程序,那么内联SQL可能没问题。

答案 6 :(得分:0)

我更喜欢内联sql,除非存储过程涉及实际逻辑(变量,游标等)。我最近一直在使用LINQ to SQL,并采用生成的类并添加具有一些预定义的常见linq查询的部分类。我觉得这样可以加快开发速度。

编辑:我知道我会为此得到降级。如果你曾经谈过外键或存储过程,你会得到降级。我想DBA需要工作保障......

答案 7 :(得分:0)

使用Subsonic,您将使用内联,视图和存储过程。 Subsonic使数据访问更容易,但您无法在亚音速查询中进行翻转。虽然最新版本,2.1正在变得更好。

对于基本的CRUD操作,内联SQL将是直截了当的。对于更复杂的数据需求,需要进行视图,然后您将对视图执行Subsonic查询。

存储过程适用于较难的数据计算和数据检索。基于集合的检索通常总是比程序处理快。

当前的Subsonic应用程序使用所有三个选项,效果很好。

答案 8 :(得分:0)

  1. 存储过程将数据和代码分组,以便在一个点上操作/提取该数据。这使得DBA的生命变得更加容易(假设您的应用程序足够大,可以保证DBA),因为它们可以根据已知因素进行优化。

  2. 存储过程可以包含最好留在数据库中的逻辑。我已经在DB2 / z中看到了存储过程,其中包含许多行,但是所有客户端必须编写代码就像“给我那个列表”一样。

  3. 我发现使用存储过程的最大好处是,当我们想要改变逻辑时,在内联查询的情况下,我们需要去每个地方并更改它并重新滚动每个应用程序但是在存储过程更改的情况仅在一个地方需要。

  4. 所以当你有清晰的逻辑时,请使用内联查询;否则更喜欢存储过程。

答案 9 :(得分:0)

存储过程的优点(在我看来)

  1. SQL在一个地方
  2. 您可以获得查询计划。
  3. 如有必要,您可以修改数据库结构以提高性能
  4. 它们被编译,因此这些查询计划不必动态构建
  5. 如果您使用权限 - 您可以确定应用程序将进行的查询。