【发布时间】: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