sql-server - 'Update Check' 对于 LINQ UPDATES 有多少开销

标签 sql-server linq updatecheck

我有一个使用 LINQ 编辑的简单行。它有大约 30 列,包括主键数字序列。

当通过 LINQ 执行 UPDATE 时,UPDATE 语句包括表的所有列(用于并发检查)。

我想知道这是多么低效 - 如果不是 negligibiel 的话。由于主键上有一个索引,我假设该列用于初始行搜索,然后另外检查其他字段。我没想到这会花费可忽略不计的时间。

我问这个问题的原因是我发现这个更新在某些情况下花费了一秒钟以上,这似乎不太正确。可能还有其他长时间运行的操作正在发生,但这让我很好奇我是否应该担心。

我知道我可以将所有其他字段的“UpdateCheck”设置为“从不”,但这很痛苦。

有没有办法关闭单个 SubmitChanges() 的“更新检查”,或者我是否必须通过更改每个字段的“UpdateCheck”来完成此操作。

如有任何建议,我们将不胜感激。

这是 SQL 更新:

exec sp_executesql N'UPDATE [dbo].[SiteVisit]
SET [TotalTimeOnSite] = @p12, [ContentActivatedTime] = @p13
WHERE ([SiteVisitId] = @p0) AND ([SiteUserId] IS NULL) AND ([ClientGUID] = @p1) AND ([ServerGUID] IS NULL) AND ([UserGUID] = @p2) AND ([SiteId] = @p3) AND ([EntryURL] = @p4) AND ([CampaignId] = @p5) AND ([Date] = @p6) AND ([Cookie] IS NULL) AND ([UserAgent] = @p7) AND ([Platform] IS NULL) AND ([Referer] = @p8) AND ([KnownRefererId] = @p9) AND ([FlashVersion] IS NULL) AND ([SiteURL] IS NULL) AND ([Email] IS NULL) AND ([FlexSWZVersion] IS NULL) AND ([HostAddress] IS NULL) AND ([HostName] IS NULL) AND ([InitialStageSize] IS NULL) AND ([OrderId] IS NULL) AND ([ScreenResolution] IS NULL) AND ([TotalTimeOnSite] IS NULL) AND ([CumulativeVisitCount] = @p10) AND ([ContentActivatedTime] IS NULL) AND ([ContentCompleteTime] IS NULL) AND ([MasterVersion] = @p11) AND ([VisitedHome] IS NULL) AND ([VisitedStore] IS NULL) AND ([VisitedVideoDemos] IS NULL) AND ([VisitedProducts] IS NULL) AND ([VisitedAdvantages] IS NULL) AND ([VisitedGallery] IS NULL) AND ([VisitedTestimonials] IS NULL) AND ([VisitedEvolution] IS NULL) AND ([VisitedFAQ] IS NULL)',N'@p0 int,@p1 uniqueidentifier,@p2 uniqueidentifier,@p3 int,@p4 varchar(46),@p5 varchar(3),@p6 datetime,@p7 varchar(164),@p8 varchar(36),@p9 int,@p10 int,@p11 int,@p12 int,@p13 int',@p0=1009772,@p1='039A0614-31EE-4DD9-9E1A-8A0F947E1719',@p2='C83C0E68-142A-47CB-B7F9-BAF462E79429',@p3=1,@p4='http://www.example.com/default.aspx?c=183',@p5='183',@p6='2008-11-30 18:22:59:047',@p7='Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SIMBAR={85B62341-3F6B-4645-A473-53A2D2BB66DC}; FunWebProducts; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727)',@p8='http://apps.facebook.com/inthemafia/',@p9=1,@p10=1,@p11=30,@p12=6,@p13=6

最佳答案

我们很早就在 Stack Overflow 上遇到了这个问题。每个 LINQ to SQL 更新都会在写入更新之前验证基础字段是否未更改。换句话说,每次更新都是“仅当该字段等于,并且该字段等于,并且该字段等于时才更新记录”..

我们决定大多数时候我们不关心悲观更新,更新需要检查的唯一字段是 Id 字段。

因此,我们所做的就是为 dbml 映射文件中除 Id 之外的每个字段设置 UpdateCheck="never",如下所示:

<Type Name="Badge">
  <Column Name="Id" Type="System.Int32" DbType="Int NOT NULL IDENTITY"
      IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
  <Column Name="Class" Type="System.Byte" DbType="TinyInt NOT NULL"
      CanBeNull="false" UpdateCheck="Never" />
  <Column Name="Name" Type="System.String" DbType="VarChar(50) NOT NULL" 
      CanBeNull="false" UpdateCheck="Never" />

我不知道是否有办法以编程方式或即时执行此操作。

关于sql-server - 'Update Check' 对于 LINQ UPDATES 有多少开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/330053/

相关文章:

java - 如何从插入 SQL 数据库的 CSV 文件中删除双引号

sql - SQL Server 2008中GEOMETRY和GEOGRAPHY的区别

c# - 如何使用 LINQ 仅获取最后一个日期

java - java程序中通过互联网进行更新检查

linq-to-sql - Linq to SQL - 在代码中关闭 UpdateCheck

sql - 每个表使用多个索引是否危险?

sql - 在 SQL 中选择具有多个 GROUP 的表中 TOP 2 值的 SUM

c# - 使用 Entity Framework 异步删除行

c# - 如何在 SQL 查询结果中动态添加行

LINQ 冲突检测 : Setting UpdateCheck attribute