【问题标题】:Linq methods add vs. stored procedure addLinq 方法添加与存储过程添加
【发布时间】:2016-04-05 14:30:34
【问题描述】:

我正在使用 Entity Framework,但我对性能有疑问。

这是我的 linq add 方法:

CarTable newCar = new CarTable()
            {
                CarPlate = plate,
                CarModel = model,
                CarColor = color,
                CarImage = image
            };

entity.CarTable.Add(newCar);
entity.SaveChanges();

这是一个用于相同目的的存储过程:

CREATE PROC prCreateCar
    (@plate NVARCHAR(20), 
     @model NVARCHAR(50), 
     @color NVARCHAR(10), 
     @image NVARCHAR(MAX))
AS
BEGIN
     INSERT INTO CarTable
     VALUES (@plate, @model, @color, @image)
END

然后从 asp.net 调用它:

entity.prCreateCar('34 F5 3498','Renault Clio','Blue','Images/Cars/clio.png');

它们都工作正常,但这是我的问题.. 哪一个提供更好的性能?我听说存储过程更快,但这是真的吗?如果是真的,在 SELECT、DELETE、UPDATE 和 INSERT 等所有条件下是否更快?

【问题讨论】:

  • 这将取决于您在实体框架下使用的 实际 RDBMS - 但如果您这样做,对于 SQL Server,我认为性能会非常好可比。这两种方法最终都会导致需要执行的参数化查询 - 如果执行得当,两种方法的行为都会非常相似。
  • 但要注意一点:为什么你使用nvarchar(max)作为你的图像!?!?!?这是一组 二进制 数据 - 最好使用 varbinary(max)(而不是基于字符串的数据类型)
  • 它保存图像的路径,因此它不是二进制数据集,感谢您的回复,这是我正在寻找的答案:) @marc_s
  • EF 有一些开销,但是像这样的插入甚至不值得测量(如果有很多插入,您既不会使用 EF 也不会使用类似的过程进行批量操作) - 该过程与使用普通的动态 SQL 没有什么不同)。

标签: c# performance entity-framework linq stored-procedures


【解决方案1】:

对于这样简单的查询,可能不会有太大区别。如果您有更复杂的查询(跨许多不同的表/子查询/等连接),仅使用不同的参数,存储过程的性能通常会更好,因为数据库只需要创建一次执行计划,然后可以缓存它,而它将为每个常规 SQL 查询重新创建。

如果您必须连续进行大量插入,例如从外部源(目录数据或类似的东西)导入数据时,您可能需要使用 BULK INSERT 语句。 EF 也有一些扩展,允许以类似于常规 EF 操作的方式使用该功能——尽管我没有这些实践经验。一个例子是EntityFramework.BulkInsert

【讨论】:

    猜你喜欢
    • 2017-04-26
    • 2012-09-03
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多