我有一个简单的行,我使用LINQ编辑.它有大约30列,包括主键数字序列.
当通过LINQ执行UPDATE时,UPDATE语句包括表的所有列(用于并发检查).
我想知道这是多么低效 - 如果不是无聊的话.由于主键上有索引,我假设该列用于初始行搜索,然后另外检查其他字段.我不会想到这将花费的时间可以忽略不计.
我问的原因是我在某些情况下看到这个UPDATE接管了一秒钟,这似乎不对.可能还有其他长期运行的事情正在发生,但这让我很好奇我是否应该担心.
我知道我可以将'UpdateCheck'设置为永远不会用于所有其他字段,但这很痛苦.
有没有办法关闭单个SubmitChanges()的'Update Check',或者我必须通过为每个字段更改'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
Jeff Atwood.. 21
我们在Stack Overflow上遇到了这个问题.在编写更新之前,每个LINQ to SQL更新都会验证基础字段是否未更改.换句话说,每次更新都是" 仅当此字段等于时更新记录,并且此字段等于,并且此字段等于"..
我们决定大多数时候我们不关心悲观更新,更新需要检查的唯一字段是Id字段.
因此,我们所做的是UpdateCheck="never"
为除dbml映射文件中的Id之外的每个字段设置,如下所示:
我不知道是否有办法以编程方式或即时方式执行此操作.
我们在Stack Overflow上遇到了这个问题.在编写更新之前,每个LINQ to SQL更新都会验证基础字段是否未更改.换句话说,每次更新都是" 仅当此字段等于时更新记录,并且此字段等于,并且此字段等于"..
我们决定大多数时候我们不关心悲观更新,更新需要检查的唯一字段是Id字段.
因此,我们所做的是UpdateCheck="never"
为除dbml映射文件中的Id之外的每个字段设置,如下所示:
我不知道是否有办法以编程方式或即时方式执行此操作.
您断言更新检查的开销可以忽略不计是正确的.如果where子句的任何部分都满足索引(或主键),那么将使用该索引.检查其他列的成本可以忽略不计.您可以通过在SQL管理工作室(或旧版SQL Server的查询分析器)中启用执行计划显示并运行更新来确认这一点.
执行时间过长很可能是由其他原因造成的.锁定是一个很好的选择.如果您可以重现它,请使用SQL事件探查器来查找正在发生的事情.