代码之家  ›  专栏  ›  技术社区  ›  Carvellis

使用编译查询时是否仍需要存储过程?

  •  14
  • Carvellis  · 技术社区  · 15 年前

    编译后的查询将作为参数化查询缓存,因此性能应该接近于存储过程。是否存在存储过程性能显著提高的情况?

    作为对Yakimych下面的回答的回应,我的意思并不是说编译的查询和存储过程是一样的。如果您已经在应用程序端完成了所有可能的优化(在本例中是编译的查询),那么我试图弄清楚存储过程是否仍然是必要的。所以我想我在寻找为什么存储过程比 结合 应用程序端优化和参数化查询(编译查询就是这样的)。

    我问这个问题的原因之一,是因为有许多人似乎认为存储过程由于不同的原因不再是必要的(例如。 this post

    3 回复  |  直到 15 年前
        1
  •  5
  •   Rui Jarimba    13 年前

    “是否存在存储过程性能显著提高的情况?”

    给定在EF或存储过程中生成的一段可比较的参数化SQL,它们的性能将相同。

    我们有一个非常复杂的sqlserverdb,它有许多外部系统通过触发器来复制数据。EF的问题是,当使用任何ORM而不是dba时,对DB激发的SQL的责任将成为应用程序开发人员的责任。

        2
  •  9
  •   Yakimych    15 年前

    首先,编译EF查询与使用存储过程可以获得的性能优势无关。

    http://msdn.microsoft.com/en-us/library/cc853327.aspx -对概念模型执行查询时,会发生以下操作:

    • 打开数据库连接
    • 生成视图
    • 准备查询
    • 加载和验证类型
    • 跟踪

    以及关于 Preparing the query

    因此,如果编译查询并在以后重新使用它,那么在每次后续的查询执行过程中,将节省应用程序中此操作的时间。但是,您不会影响针对数据库执行的生成的SQL代码。 编译查询时获得的性能好处是在应用程序级别。

    另一方面,如果您对生成的SQL代码不满意,并且希望在数据库级别优化性能,则通常会使用存储过程。

    回应你的评论和编辑。

    在我看来,您的印象是编译EF查询会以某种方式更改将针对数据库运行的生成的SQL代码(您提到编译的查询会导致参数化SQL查询?)。事实并非如此。无论您是直接运行查询还是使用 compiledQuery.Invoke , 相同的SQL代码将在DB上运行

    • 编译查询纯粹是一种 应用程序端优化。它 在代码中被重复使用。
    • 存储过程可用于调整SQL代码,使其尽可能与目标匹配,从而提供在数据库级别获得最佳性能的可能性。

        3
  •  3
  •   A-K    15 年前

    一些著名专家的固定答案:保罗尼尔森 Why use Stored Procedures?

    亚当·马查尼克: No, stored procedures are NOT bad