【问题标题】:Stored procedure vs simple SQL performance comparison [closed]存储过程与简单 SQL 性能比较 [关闭]
【发布时间】:2020-02-10 18:42:45
【问题描述】:

存储过程与 C# OR linq 查询中的简单 SQL 查询之间的性能比较。

CREATE PROCEDURE [dbo].[GetProductCM] 
AS 
BEGIN 
    SET NOCOUNT ON 

    SELECT 
        p.ProductId, 
        p.ProductName, 
        p.CategoryId
    FROM 
        dbo.Product p
END 
using (SqlConnection myConnection = new SqlConnection(con))
{
    string oString = "SELECT p.ProductId, p.ProductName,  p.CategoryI FROM dbo.Product p";

    SqlCommand oCmd = new SqlCommand(oString, myConnection);
    myConnection.Open();

    using (SqlDataReader oReader = oCmd.ExecuteReader())
    {
        while (oReader.Read())
        {    
            Product.ProductName= oReader["ProductName"].ToString();
            Product.CategoryI = oReader["CategoryI "].ToString();                       
        }

        myConnection.Close();
    }               
}
var queryAllProduct  = from p in Product 
                       select p;

最佳做法是什么?

【问题讨论】:

  • 我的理解是,现在执行计划无论如何都会被缓存。唯一显着的区别可能在于您可以限制使用存储过程提取的列,这将限制数据传输大小和花费在投影上的时间。
  • 使用存储过程的原因不是查询性能,而是安全、安全管理和数据库管理问题。然而,它也使性能管理更容易,并且可以一些将客户端代码与数据库模式问题分开。
  • SP 的一个好处是,当缓存了错误的存储过程计划时,您可以清除每个存储过程的计划缓存。对于临时查询,您必须通过 DBCC FREESYSTEMCACHE('SQL Plans') 清除所有临时计划
  • 正如当前答案所示,这更像是圣战的话题。由于,您会发现不乏有人主张即席查询或存储过程是魔鬼的工具,而其他技术显然是优越的存在。就性能而言,由于参数嗅探之类的原因,问题实际上比您想象的还要复杂,但底线是任何一种方法都可以与另一种方法一样好,尽管使用不同的技术。 (不过,我会说强制计划进行临时查询并不好玩。)
  • 请注意,无论您使用哪种技术,请确保它不易受到 SQL 注入的影响——换句话说,如果您使用“简单查询”,请确保将它们参数化,而不是连接字符串。无论您如何提供查询,都可以进行参数化。

标签: c# sql sql-server entity-framework


【解决方案1】:

不使用存储过程。

SQL Server 7 消除了预编译存储过程的性能优势(是的,即 7 到 25 年前,IIRC)。从那时起,计划被缓存并重用于动态 SQL。现在存储过程只有在

  • SQL 非常大,结果非常慢(减少网络流量)并且网络很慢。
  • 您进行复杂的处理,否则需要残酷的数据传输。

事实上,在您的特定情况下,我会使用 ORM 和 LINQ,而不是浪费我的时间手动编写可以生成的 SQL 代码(这很容易占程序代码的 40%)。

【讨论】:

  • 好吧,我想说“现在 SP 仅在出于性能原因 如果...时才有意义。”使用存储过程还有其他很好的理由。
  • 想要更多维护?是的我同意。如果您想花时间维护像上面这样的简单 sp,那么您有一个要点 - 将您花在项目上的时间加倍并确保查询效率低下的好方法。
  • 来吧,汤姆,它可能会增加维护,但它不会固有地使 SQL 效率降低。我上面列出的原因是安全、安全管理、性能管理、数据库管理和一些(小)代码/模式独立性。您可能还记得,我同时进行客户端开发和数据库开发和管理。我知道付出了更多的努力,但与许多其他需要额外努力的事情一样,恕我直言,这是值得的。我尝试了两种极端方法和大多数中间方法,并且我确信 SP-API 是可行的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 2012-04-03
  • 2015-05-26
  • 2014-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多