Сколько наверху 'Обновляет Проверку', имеют для ОБНОВЛЕНИЙ LINQ

Несмотря на то, что ответ Жан-Батиста верен, я считаю, что в данном случае более важно, что вся 0 память во всех трех процессах, которые вы отмечаете, являются потоками ядра. Их память - это вся память ядра, и она не отображается сверху или пс. Вы можете сказать, что это поток ядра в linux как по команде, заключенной в квадратные скобки, так и по процессу, не занимающему память в столбце VSZ. (Это столбец, представляющий практически все, что можно считать памятью процесса. Это только 0 для потоков ядра, и это только потому, что они не сообщают должным образом свою память.

Также обратите внимание, что со временем запуска в 2018 и, потратив не более 1 минуты 41 секунды, ни одна из этих работ на самом деле не очень активна.

12
задан Simon_Weaver 1 December 2008 в 04:34
поделиться

5 ответов

Ваше утверждение, что издержки для проверки обновления незначительны, корректно. Если будет индекс (или первичный ключ), который удовлетворен любой частью, где пункт, то это будет использоваться. Стоимость для проверки других столбцов незначительна. Можно подтвердить это путем включения дисплея плана выполнения в студии управления SQL (или запросить анализатор для более старых версий SQL Server), и выполните обновление.

Долгое время выполнения, скорее всего, вызывается чем-то еще. Блокировка является хорошим кандидатом. Если можно воспроизвести его, используйте SQL Profiler для обнаружения то, что продолжается.

5
ответ дан 2 December 2019 в 04:17
поделиться

Мы столкнулись с этим рано на Переполнении стека. Каждый LINQ к обновлению SQL проверяет, что базовые поля не изменились прежде, чем записать обновление. Другими словами, каждое обновление является "обновлением запись, только если это поле равняется, и это поле равняется, и это поле равняется"..

Мы решили большую часть времени, что мы не заботились о пессимистических обновлениях, и единственное поле, которое должно проверить обновление, является полем Id.

Так, что мы сделали был установлен UpdateCheck="never" для каждого поля кроме идентификатора в dbml отображающийся файл, как так:

<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" />

Я не знаю, существует ли способ сделать это программно или на лету.

21
ответ дан 2 December 2019 в 04:17
поделиться

Лично, мне нравится простота единственного timestamp/row-version столбца; установите это как единственный столбец, который будет проверен (IIRC, происходит автоматически для timestamp), и Вы отсортированы - необходимо затем получить TSQL как:

exec sp_executesql N'UPDATE [dbo].[SiteVisit]
SET [TotalTimeOnSite] = @p2, [ContentActivatedTime] = @p3
WHERE ([SiteVisitId] = @p0) AND ([Timestamp] = @p1)

Это полагается на их то, что я был параллельными (неконфликтующими) обновлениями той же записи; с timestamp/row-version и т.д., любое конфликтующее обновление заставит второе прерываться, даже если они обновили различные столбцы и т.д.

4
ответ дан 2 December 2019 в 04:17
поделиться

Поле метки времени, конечно, казалось, было самым изящным способом сделать это. Я ОЧЕНЬ НЕ ХОЧУ иметь необходимость смешать со свойствами отдельного поля - главным образом, таким образом, я могу безопасно удалить и повторно добавить таблицу к своему файлу DBML, не имея необходимость волноваться о последствиях.

http://msdn.microsoft.com/en-us/library/bb470449.aspx

SQL, теперь сгенерированный для ОБНОВЛЕНИЯ:

exec sp_executesql N'UPDATE [dbo].[SiteVisit]
SET [TotalTimeOnSite] = @p2
WHERE ([SiteVisitId] = @p0) AND ([timestamp] = @p1)

и в той же транзакции:

SELECT [t1].[timestamp]
FROM [dbo].[SiteVisit] AS [t1]
WHERE ((@@ROWCOUNT) > 0) AND ([t1].[SiteVisitId] = @p3)',N'@p0 int,@p1 timestamp,@p2 int,@p3 int',@p0=814109,@p1=0x0000000000269CB8,@p2=1199920,@p3=814109

Это делает ОБНОВЛЕНИЕ и затем получает новую метку времени для передачи обратно моему клиенту. Я не уверен, что полностью понимаю то, о чем @@ ROWCOUNT> 0 средств, но прямо сейчас я действительно не забочусь :)

4
ответ дан 2 December 2019 в 04:17
поделиться

Если вы можете изменить схему, добавьте столбец типа rowversion. Последний LINQ to SQL устанавливает проверку обновления на Никогда для всех столбцов. Если у вас есть временная метка, она будет использовать ее как оптимистическую проверку блокировки, и система будет увеличивать ее каждый раз, когда происходит обновление.

ПРИМЕЧАНИЕ. Раньше это был тип данных Timestamp, определенный в SQL '92, но он реализован без какой-либо временной информации, поэтому он не был совместим с какой-либо другой стандартной системой. Может быть, это было сделано намеренно, кто знает.

Раньше это был тип данных Timestamp, определенный в SQL '92, но он реализован без какой-либо временной информации, поэтому он не был совместим с какой-либо другой стандартной системой. Может быть, это было сделано намеренно, кто знает.

Раньше это был тип данных Timestamp, определенный в SQL '92, но он реализован без какой-либо временной информации, поэтому он не был совместим с какой-либо другой стандартной системой. Может быть, это было сделано намеренно, кто знает.

1
ответ дан 2 December 2019 в 04:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: