Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
Добрый день! Кто может подсказать почему возникает deadlock и можно ли его побороть. Согласно графу deadlock происходит Key Lock индекса PK_Calculation. В БД выполняется сохранение связанных данных: 1. Идёт вставка 1 записи в таблицу Data.Calculation 2. Идёт вставка множества записей в таблицы, которые связанны с таблицей Data.Calculation по внешнему ключу (FK_Calculation_....) Все deadlock одинаковые. В приложении граф deadlock. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 12:49 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
Картинка deadlock ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 12:51 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
egorrezchikov, имхо INSERT INTO Data.Calculation WITH (ROWLOCK, HOLDLOCK) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 13:30 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
egorrezchikov2. Идёт вставка множества записей в таблицы, которые связанны с таблицей Data.Calculation по внешнему ключу (FK_Calculation_....)И они пересекаются по CalculationId с данными, вставленными в Data.Calculation в других соединениях? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 14:47 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
TaPaK, помочь может как раз наоборот принудительная ескалация вверх ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 14:59 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
Согласно графу deadlockTaPaK, помочь может как раз наоборот принудительная ескалация вверх то таки вы тока ROWLOCK видите? или всё лечим табоками? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 15:01 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
invm, Нет, данные с другими соединениям не пересекаются, в каждом соединении используется свой CalсulationId. Есть таблица Data.Calculation которая описывает шапку расчёта и 4 таблицы в одной их которых содержатся результаты расчёта и входные данные расчёта. Как раз в этих 4 таблицах используется CalсulationId как внешний ключ для результатов и входных данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 15:11 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
TaPaK, После применения старые блокировки не ушли а добавились новые. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 15:13 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
egorrezchikov, я б предложил FK или совсем пристрелить (на возможность этого нам намекает название схемы) или отключать на время объемных вставок в зависимые таблицы. Или с той стороны (да в целом хоть с какой) PAGLOCK воткни и попробуй. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 15:19 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
egorrezchikov, а как вы @CalculationId получаете?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 15:24 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
TaPaK, Sequence ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 15:28 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
egorrezchikov, покажите весь скрипт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 15:35 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
Ну это типовая ситуация. Индекс + кластерный индекс процесс пишет и тут же читает + второй такой же процесс. Скорее всего, поможет покрывающий индекс, дабы правый инсерт с поздапросом не лез в кластерный индекс за недостающими полями. А ещё лучше перепишите вставку без подзапросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 15:43 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
Владислав КолосовНу это типовая ситуация. Индекс + кластерный индекс процесс пишет и тут же читает + второй такой же процесс. Скорее всего, поможет покрывающий индекс, дабы правый инсерт с поздапросом не лез в кластерный индекс за недостающими полями. А ещё лучше перепишите вставку без подзапросов. т.е. граф не открывали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 15:44 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
TaPaK, DECLARE @CalculationId int = NEXT VALUE FOR Data.SeqCalculation; INSERT INTO Data.Calculation WITH (ROWLOCK, HOLDLOCK) (CalculationId, TaskId, DateFrom, DateTo, CalcDateTime, StepTypeId, LocationId, TargetExternalSourceId, Target, Comment, UserProfileId, CalculationSetId) VALUES (@CalculationId, @TaskId, @DateFrom, @DateTo, @CalcDateTime, @StepTypeId, @LocationId, @TargetExternalSourceId, @Target, @Comment, @UserProfileId, @CalculationSetId); INSERT INTO Data.CalculationFactor(CalculationFactorId, CalculationId, FactorId, ValueDateTime, Value, ExternalSourceId, IsChanged) SELECT ROW_NUMBER() OVER(ORDER BY ValueDateTime)+ CONVERT(bigint,@range_first_value_factor)-1, @CalculationId, EntityId, ValueDateTime, Value, [Source], 0 FROM @factorData INSERT INTO Data.CalculationResult(CalculationResultId, CalculationId,ObjectControlId,ValueDateTime,Mdp,Adp,MdpReverse,AdpReverse,IsControlKpos,MdpInstructionValueId, AdpInstructionValueId, [Rule], MdpOriginal, AdpOriginal,Temperature,MdpMptFormula,ExternalSourceId,InstructionLineRepairId,ArchmState,IrregularFluctuation,MdpClear) SELECT ROW_NUMBER() OVER(ORDER BY ValueDateTime)+ CONVERT(bigint,@range_first_value_result)-1, @CalculationId,ObjectControlId,ValueDateTime,MdpValue,AdpValue,null,null,IsControlled,MdpInstructionValueId,AdpInstructionValueId, [Rule], MdpOriginalValue, AdpOriginalValue,Temperature,MdpMptFormula,[Source],RepairSchemaId,ArchmState,IrregularFluctuation,MdpClear FROM @resultValue ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 15:45 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
в общую транзакцию оберните ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 15:47 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
egorrezchikov, так а где ваше Meteo? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 15:49 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
TaPaK, Полная версия тела ХП SET NOCOUNT ON; SET XACT_ABORT ON; DECLARE @TaskCode varchar(50); SET @TaskCode = (SELECT Code FROM Sec.Task WITH(NOLOCK) WHERE TaskId = @TaskId) DECLARE @ErrorMessage varchar(8000),@ErrorSeverity INT,@ErrorState INT,@ErrorNumber INT; DECLARE @timeout varchar(20) declare @rc int = 0 -- return code DECLARE @triesMax int = 10; DECLARE @tries int SET @tries = 0 WHILE @tries<@triesMax BEGIN BEGIN TRY BEGIN TRAN DECLARE @sequence_name nvarchar(100), @range_size int, @range_first_value_factor sql_variant, @range_first_value_meteo sql_variant, @range_first_value_ne sql_variant, @range_first_value_result sql_variant, @range_last_value sql_variant, @sequence_increment sql_variant, @sequence_min_value sql_variant, @sequence_max_value sql_variant; SET @sequence_name = 'Data.SeqCalculationFactor' select @range_size = count(*) from @factorData if @range_size>0 EXEC sp_sequence_get_range @sequence_name = @sequence_name, @range_size = @range_size, @range_first_value = @range_first_value_factor OUTPUT, @range_last_value = @range_last_value OUTPUT, @sequence_increment = @sequence_increment OUTPUT,@sequence_min_value = @sequence_min_value OUTPUT,@sequence_max_value = @sequence_max_value OUTPUT; SET @sequence_name = 'Data.SeqCalculationResultMeteo' select @range_size = count(*) from @meteoData if @range_size>0 EXEC sp_sequence_get_range @sequence_name = @sequence_name, @range_size = @range_size, @range_first_value = @range_first_value_meteo OUTPUT, @range_last_value = @range_last_value OUTPUT, @sequence_increment = @sequence_increment OUTPUT,@sequence_min_value = @sequence_min_value OUTPUT,@sequence_max_value = @sequence_max_value OUTPUT; SET @sequence_name = 'Data.SeqCalculationNetElement' select @range_size = count(*) from @repairPoint if @range_size>0 EXEC sp_sequence_get_range @sequence_name = @sequence_name, @range_size = @range_size, @range_first_value = @range_first_value_ne OUTPUT, @range_last_value = @range_last_value OUTPUT, @sequence_increment = @sequence_increment OUTPUT,@sequence_min_value = @sequence_min_value OUTPUT,@sequence_max_value = @sequence_max_value OUTPUT; SET @sequence_name = 'Data.SeqCalculationResult' select @range_size = count(*) from @resultValue if @range_size>0 EXEC sp_sequence_get_range @sequence_name = @sequence_name, @range_size = @range_size, @range_first_value = @range_first_value_result OUTPUT, @range_last_value = @range_last_value OUTPUT, @sequence_increment = @sequence_increment OUTPUT,@sequence_min_value = @sequence_min_value OUTPUT,@sequence_max_value = @sequence_max_value OUTPUT; IF 1 = 1 BEGIN DECLARE @CalcDateTime datetime = GETUTCDATE(); DECLARE @StepTypeId int = '24'; DECLARE @TargetExternalSourceId int = NULL; DECLARE @Target varchar(850) = NULL; DECLARE @CalculationId int = NEXT VALUE FOR Data.SeqCalculation; INSERT INTO Data.Calculation WITH (ROWLOCK, HOLDLOCK) (CalculationId, TaskId, DateFrom, DateTo, CalcDateTime, StepTypeId, LocationId, TargetExternalSourceId, Target, Comment, UserProfileId, CalculationSetId) VALUES (@CalculationId, @TaskId, @DateFrom, @DateTo, @CalcDateTime, @StepTypeId, @LocationId, @TargetExternalSourceId, @Target, @Comment, @UserProfileId, @CalculationSetId); END IF 1 = 1 BEGIN INSERT INTO Data.CalculationFactor(CalculationFactorId, CalculationId, FactorId, ValueDateTime, Value, ExternalSourceId, IsChanged) SELECT ROW_NUMBER() OVER(ORDER BY ValueDateTime)+ CONVERT(bigint,@range_first_value_factor)-1, @CalculationId, EntityId, ValueDateTime, Value, [Source], 0 FROM @factorData END IF 1 = 1 BEGIN INSERT INTO Data.CalculationResultMeteo(CalculationResultMeteoId, CalculationId, MeteoPointId, EnergySystemId,ValueDateTime, MeteoTypeId, Value) SELECT ROW_NUMBER() OVER(ORDER BY ValueDateTime)+ CONVERT(bigint,@range_first_value_meteo)-1, @CalculationId, CASE WHEN @TaskCode = '2' OR @TaskCode = '1' THEN EntityId ELSE NULL END AS MeteoPointId, CASE WHEN @TaskCode = '3' THEN EntityId ELSE NULL END AS EnergySystemId, ValueDateTime, null, Value FROM @meteoData where Value is not null or @TaskCode = '2' OR @TaskCode = '1' END IF 1 = 1 BEGIN INSERT INTO Data.CalculationNetElement(CalculationNetElementId, CalculationId, NetElementId, ValueDateTime, Value, ExternalSourceId, IsChanged) SELECT ROW_NUMBER() OVER(ORDER BY PointDate)+ CONVERT(bigint,@range_first_value_ne)-1, @CalculationId, NetElementId, PointDate, 1, [Source], IsChanged FROM @repairPoint END IF 1 = 1 BEGIN INSERT INTO Data.CalculationResult(CalculationResultId,CalculationId,ObjectControlId,ValueDateTime,Mdp,Adp,MdpReverse,AdpReverse,IsControlKpos,MdpInstructionValueId, AdpInstructionValueId, [Rule], MdpOriginal, AdpOriginal,Temperature,MdpMptFormula,ExternalSourceId,InstructionLineRepairId,ArchmState,IrregularFluctuation,MdpClear) SELECT ROW_NUMBER() OVER(ORDER BY ValueDateTime)+ CONVERT(bigint,@range_first_value_result)-1, @CalculationId,ObjectControlId,ValueDateTime,MdpValue,AdpValue,null,null,IsControlled, case when MdpInstructionValueId = 0 then null else MdpInstructionValueId end as MdpInstructionValueId, case when AdpInstructionValueId = 0 then null else AdpInstructionValueId end as AdpInstructionValueId, [Rule], MdpOriginalValue, AdpOriginalValue,Temperature,MdpMptFormula,[Source], case when RepairSchemaId = 0 then null else RepairSchemaId end as RepairSchemaId, ArchmState,IrregularFluctuation,MdpClear FROM @resultValue END SELECT @CalculationId AS CalculationId COMMIT TRAN END TRY BEGIN CATCH IF @@TRANCOUNT > 0 ROLLBACK TRAN; SET @tries = @tries + 1 SELECT @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE(), @ErrorNumber = ERROR_NUMBER(); IF (@ErrorNumber = 1205 OR @ErrorNumber = 1222) AND @tries < @triesMax begin set @timeout = '00:00:0'+Substring(CONVERT(varchar(20),RAND()),1,4) WAITFOR DELAY @timeout CONTINUE end RAISERROR(@ErrorMessage, 16, 1); END CATCH BREAK; END -- TRIES ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 15:54 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
egorrezchikovDECLARE @CalculationId int = NEXT VALUE FOR Data.SeqCalculation; INSERT INTO Data.Calculation WITH (ROWLOCK, HOLDLOCK) (CalculationId, TaskId, DateFrom, DateTo, CalcDateTime, StepTypeId, LocationId, TargetExternalSourceId, Target, Comment, UserProfileId, CalculationSetId) VALUES (@CalculationId, @TaskId, @DateFrom, @DateTo, @CalcDateTime, @StepTypeId, @LocationId, @TargetExternalSourceId, @Target, @Comment, @UserProfileId, @CalculationSetId); INSERT INTO Data.CalculationFactor(CalculationFactorId, CalculationId, FactorId, ValueDateTime, Value, ExternalSourceId, IsChanged) SELECT ROW_NUMBER() OVER(ORDER BY ValueDateTime)+ CONVERT(bigint,@range_first_value_factor)-1, @CalculationId, EntityId, ValueDateTime, Value, [Source], 0 FROM @factorData INSERT INTO Data.CalculationResult(CalculationResultId, CalculationId,ObjectControlId,ValueDateTime,Mdp,Adp,MdpReverse,AdpReverse,IsControlKpos,MdpInstructionValueId, AdpInstructionValueId, [Rule], MdpOriginal, AdpOriginal,Temperature,MdpMptFormula,ExternalSourceId,InstructionLineRepairId,ArchmState,IrregularFluctuation,MdpClear) SELECT ROW_NUMBER() OVER(ORDER BY ValueDateTime)+ CONVERT(bigint,@range_first_value_result)-1, @CalculationId,ObjectControlId,ValueDateTime,MdpValue,AdpValue,null,null,IsControlled,MdpInstructionValueId,AdpInstructionValueId, [Rule], MdpOriginalValue, AdpOriginalValue,Temperature,MdpMptFormula,[Source],RepairSchemaId,ArchmState,IrregularFluctuation,MdpClear FROM @resultValueВ этом скрипте нет конфликтующих инструкций из графа дедлока. В общем, конфликтуют у вас для Data.Calculation вставка и чтение при проверке FK. С учетомegorrezchikovНет, данные с другими соединениям не пересекаются, в каждом соединении используется свой CalсulationId.Такое может происходить если в инструкциях insert для соединения с Data.Calculation при проверке FK используется merge или hash. Если это так, то можете попробовать вылечить, дописав к инструкциям вставки в подчиненные таблицы option(loop join) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 15:58 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
у вас FK чистые или с какими-то глупостями класса каскад делита ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 16:10 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
Maxx, Да чистые. Вот скрипты на создание ALTER TABLE [Data].[Calculation] ADD CONSTRAINT [PK_Calculation] PRIMARY KEY CLUSTERED ( [CalculationId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) GO ALTER TABLE [Data].[CalculationResult] WITH CHECK ADD CONSTRAINT [FK_Calculation_CalculationResult] FOREIGN KEY([CalculationId]) REFERENCES [Data].[Calculation] ([CalculationId]) GO ALTER TABLE [Data].[CalculationResult] CHECK CONSTRAINT [FK_Calculation_CalculationResult] GO ALTER TABLE [Data].[CalculationResultMeteo] WITH CHECK ADD CONSTRAINT [FK_Calculation_CalculationResultMeteo] FOREIGN KEY([CalculationId]) REFERENCES [Data].[Calculation] ([CalculationId]) GO ALTER TABLE [Data].[CalculationResultMeteo] CHECK CONSTRAINT [FK_Calculation_CalculationResultMeteo] GO ALTER TABLE [Data].[CalculationNetElement] WITH CHECK ADD CONSTRAINT [FK_Calculation_CalculationNetElement] FOREIGN KEY([CalculationId]) REFERENCES [Data].[Calculation] ([CalculationId]) GO ALTER TABLE [Data].[CalculationNetElement] CHECK CONSTRAINT [FK_Calculation_CalculationNetElement] GO ALTER TABLE [Data].[CalculationFactor] WITH CHECK ADD CONSTRAINT [FK_Calculation_CalculationFactor] FOREIGN KEY([CalculationId]) REFERENCES [Data].[Calculation] ([CalculationId]) GO ALTER TABLE [Data].[CalculationFactor] CHECK CONSTRAINT [FK_Calculation_CalculationFactor] GO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 16:15 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
TaPaK, Да есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 16:24 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
egorrezchikov, на всю транзакцию SERIALIZABLE можно убрать WITH (ROWLOCK, HOLDLOCK) или пробовать ставить на все инсёрты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 16:35 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
TaPaK, авторили всё лечим табоками? Какой нахрен SERIALIZABLE. SingleUser уже давай. Какие к черту ROWLOCK. У него из-за ROWLOCK проблемы и лезут. SERIALIZABLE при массовых вставках - вообще ни разу не таблок, да? еще и при FK. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 16:44 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
авторSERIALIZABLE при массовых вставках - вообще ни разу не таблок ась? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 16:48 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
TaPaK, Советы у тебя шикарные. Буквы выучил, что при этом происходить будет пока не разобрался. При коннекте ему предложи транзакцию открывать и в ней все делать до конца рабочего дня. Ну и к чему приведет SERIALIZABLE на массовых вставках в дочернюю таблицу, которая смотрит куда-то по FK? Что будет заблокировано? волшебный "диапазон"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 17:05 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
на деревне асьTaPaK, Советы у тебя шикарные. Буквы выучил, что при этом происходить будет пока не разобрался. При коннекте ему предложи транзакцию открывать и в ней все делать до конца рабочего дня. Ну и к чему приведет SERIALIZABLE на массовых вставках в дочернюю таблицу, которая смотрит куда-то по FK? Что будет заблокировано? волшебный "диапазон"? у него и так транзакция на всю длинну во втором случае таблица Result как раз таки и залочила всё что внутри и соотвественно всё что по FK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 17:07 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
Может быть дело в NONCLUSTERED INDEX ? В таблицах Data.CalculationResult, Data.CalculationNetElement есть индексы на внешний ключ CalculationId CREATE NONCLUSTERED INDEX [IX_CalculationNetElement_CalculationId] ON [Data].[CalculationNetElement] ( [CalculationId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) GO CREATE NONCLUSTERED INDEX [IX_CalculationResult_CalculationId] ON [Data].[CalculationResult] ( [CalculationId] ASC ) INCLUDE ( [ObjectControlId], [ValueDateTime], [Mdp]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) GO В остальных таблицах такого индекса нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 17:33 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
ТС, тэги есть для кода, а то глаза ломать приходиться ЗЫ у вас же дэдлок на другой таблице ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 17:36 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
egorrezchikov, Если Вы его уберете, то проблема исчезнет. Вставка слева обновляет таблицу: блокирует кластерный, накладывает намерение обновления на некластерный индекс. Процесс справа читает ту же страницу некластерного S блокировкой и хочет обновить кластерный индекс. Тот, что слева ждет снятия блокировки чтения некластерного индекса, а тот что справа ждет освобождение кластерного индекса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 17:42 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
Владислав Колосов, Спасибо за совет, попробую. Я так понял это единственное решение? Если удалить эти индексы, то потом может упасть скорость чтения данных. Я недавно читал про настройку ONLINE для индекса, она влияет только на режим rebuild или reorganize? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 17:59 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
Владислав Колосов, Дык дэдлок же на родительском пк. На эти индексы в указанном коде шаредом никто не заходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 18:00 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
egorrezchikov, удалить надо FK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 18:01 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
egorrezchikovМожет быть дело в NONCLUSTERED INDEX ?Точно! И как же мы раньше не догадались? Хотя в графах нет ни единого упоминания о некластерных индексах, дело безусловно в них. Стопудово. Вместо того, чтобы проанализировать планы запросов для понимания происходящего, или хотя бы выяснить почему же Data.CalculationFactor блокируется целиком, вы решили последовать вредным, но простым советам типа убиения индексов или FK. Остается только пожелать вам успехов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 18:48 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
egorrezchikov, Плохо, что планы оценочные, а не актуальные... Возьмем дедлочащую инструкцию из первого графа Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Если фактический план совпадает с оценочным и, как вы писали, @CalculationId неизменен, то такого дедлока просто не может быть. Потому что в этой инструкции конкурирующие процессы не пересекаются по блокировкам на Data.Calculation. Можно воспроизвестьи вашу ситуацию. Создайте тестовые таблицы: Код: sql 1. 2. 3. 4. 5. 6. Затем откройте в студии два соединения. В первом запустите Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Во втором Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. В одном из соединений возникнет дедлок. Замените option (merge join) на option (loop join) и запустите еще раз - дедлока не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2018, 12:44 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
invm, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2018, 19:35 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
и запустите еще ра, И? Гарантируете расположение потенциально конфликтующих строк всегда на одной странице? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 11:43 |
|
||
|
Помогите с deadlock PK Index
|
|||
|---|---|---|---|
|
#18+
invm, Конечно нет. Но так вполне себе веселей и дедлоков будет гораздо меньше. С учетом штучной вставки в CLUSTERED IDENTITY - вполне зашибись получится. И в каком-то смысле ближе к телу (имхо). Начнет массово делать и в разные диапазоны значений ПК - дедлоки будут, но в разы меньше чем сейчас. В случае с LOOPами при определенных сценариях другие вопросы могут возникнут характерные для лупов. Ну т.е. и так, и сяк можно. И там, и тут можно нарваться на то что работает оно "именно так как должно" и абсолютно конкретно, а не туманно волшебно. Сделать это (попробовать PAGLOCK) можно было двумя страницами ранее, как говорится "не вдаваясь в подробности", поскольку природа и сценарий абсолютно типовые. Тем же можно лечить выражение MERGE со схожими симптомами, дополненными местными особенностями. И план выполнения не трогается (хоть тут и не то что бы актуально). Я с решением не спорю, а пытаюсь дополнить еще одним свидетельством того, что проблема связана именно с собиранием конкретных нужных строк. Ну, может, чуть-чуть продолжаю спорить про предложение поставить ROWLOCK, который почти полностью и является причиной конкретной проблемы. Про удаление FK - абсолютно всерьез. Названия таблиц намекают на то что занимаются их наполнением роботы, в ХП все предельно понятно, транзакция есть. Чтобы порушить надо влезть целенаправленно руками. Оверхеды и нюансы - лицезреем в полный рост, смысла - скорее всего около нуля. Ситуация у OP вполне конкретная, он уже трай-кэтчами дедлоки свои обернул ("ишь, как ухаживает. любит, наверное" (с) особенности рыбалки), хотя вырубив объективно (с учетом представленного) незадействованный механизм полностью может от них избавиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 13:34 |
|
||
|
|

start [/forum/topic.php?all=1&fid=46&tid=1690254]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
42ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 229ms |
| total: | 340ms |

| 0 / 0 |
