powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с deadlock PK Index
40 сообщений из 40, показаны все 2 страниц
Помогите с deadlock PK Index
    #39602889
egorrezchikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Кто может подсказать почему возникает deadlock и можно ли его побороть.

Согласно графу deadlock происходит Key Lock индекса PK_Calculation.

В БД выполняется сохранение связанных данных:
1. Идёт вставка 1 записи в таблицу Data.Calculation
2. Идёт вставка множества записей в таблицы, которые связанны с таблицей Data.Calculation по внешнему ключу (FK_Calculation_....)

Все deadlock одинаковые.

В приложении граф deadlock.
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39602891
egorrezchikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Картинка deadlock
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39602930
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorrezchikov,

имхо
INSERT INTO Data.Calculation WITH (ROWLOCK, HOLDLOCK)
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603012
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorrezchikov2. Идёт вставка множества записей в таблицы, которые связанны с таблицей Data.Calculation по внешнему ключу (FK_Calculation_....)И они пересекаются по CalculationId с данными, вставленными в Data.Calculation в других соединениях?
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603028
TaPaK,

помочь может как раз наоборот принудительная ескалация вверх
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603033
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласно графу deadlockTaPaK,

помочь может как раз наоборот принудительная ескалация вверх
то таки вы тока ROWLOCK видите? или всё лечим табоками?
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603043
egorrezchikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Нет, данные с другими соединениям не пересекаются, в каждом соединении используется свой CalсulationId.
Есть таблица Data.Calculation которая описывает шапку расчёта и 4 таблицы в одной их которых содержатся результаты расчёта и входные данные расчёта. Как раз в этих 4 таблицах используется CalсulationId как внешний ключ для результатов и входных данных.
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603049
egorrezchikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

После применения старые блокировки не ушли а добавились новые.
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603062
egorrezchikov,

я б предложил FK или совсем пристрелить (на возможность этого нам намекает название схемы) или отключать на время объемных вставок в зависимые таблицы. Или с той стороны (да в целом хоть с какой) PAGLOCK воткни и попробуй.
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603069
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorrezchikov,

а как вы @CalculationId получаете??
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603078
egorrezchikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

Sequence
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603089
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorrezchikov,

покажите весь скрипт
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603105
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну это типовая ситуация. Индекс + кластерный индекс процесс пишет и тут же читает + второй такой же процесс.

Скорее всего, поможет покрывающий индекс, дабы правый инсерт с поздапросом не лез в кластерный индекс за недостающими полями.
А ещё лучше перепишите вставку без подзапросов.
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603110
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовНу это типовая ситуация. Индекс + кластерный индекс процесс пишет и тут же читает + второй такой же процесс.

Скорее всего, поможет покрывающий индекс, дабы правый инсерт с поздапросом не лез в кластерный индекс за недостающими полями.
А ещё лучше перепишите вставку без подзапросов.
т.е. граф не открывали?
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603111
egorrezchikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603116
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в общую транзакцию оберните
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603118
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorrezchikov,

так а где ваше Meteo?
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603128
egorrezchikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603134
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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)
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603151
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у вас FK чистые или с какими-то глупостями класса каскад делита ?
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603156
egorrezchikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603163
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorrezchikov,

а для 21197198
xml есть?
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603173
egorrezchikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

Да есть.
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603187
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorrezchikov,

на всю транзакцию SERIALIZABLE

можно убрать WITH (ROWLOCK, HOLDLOCK) или пробовать ставить на все инсёрты
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603195
TaPaK,

авторили всё лечим табоками?
Какой нахрен SERIALIZABLE. SingleUser уже давай. Какие к черту ROWLOCK. У него из-за ROWLOCK проблемы и лезут.
SERIALIZABLE при массовых вставках - вообще ни разу не таблок, да? еще и при FK.
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603199
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторSERIALIZABLE при массовых вставках - вообще ни разу не таблок
ась?
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603210
TaPaK,

Советы у тебя шикарные. Буквы выучил, что при этом происходить будет пока не разобрался. При коннекте ему предложи транзакцию открывать и в ней все делать до конца рабочего дня.

Ну и к чему приведет SERIALIZABLE на массовых вставках в дочернюю таблицу, которая смотрит куда-то по FK? Что будет заблокировано? волшебный "диапазон"?
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603214
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на деревне асьTaPaK,

Советы у тебя шикарные. Буквы выучил, что при этом происходить будет пока не разобрался. При коннекте ему предложи транзакцию открывать и в ней все делать до конца рабочего дня.

Ну и к чему приведет SERIALIZABLE на массовых вставках в дочернюю таблицу, которая смотрит куда-то по FK? Что будет заблокировано? волшебный "диапазон"?
у него и так транзакция на всю длинну
во втором случае таблица Result как раз таки и залочила всё что внутри и соотвественно всё что по FK
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603236
egorrezchikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может быть дело в 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


В остальных таблицах такого индекса нет.
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603240
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТС,
тэги есть для кода, а то глаза ломать приходиться

ЗЫ
у вас же дэдлок на другой таблице
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603246
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorrezchikov,

Если Вы его уберете, то проблема исчезнет.
Вставка слева обновляет таблицу: блокирует кластерный, накладывает намерение обновления на некластерный индекс. Процесс справа читает ту же страницу некластерного S блокировкой и хочет обновить кластерный индекс. Тот, что слева ждет снятия блокировки чтения некластерного индекса, а тот что справа ждет освобождение кластерного индекса.
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603263
egorrezchikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

Спасибо за совет, попробую.
Я так понял это единственное решение? Если удалить эти индексы, то потом может упасть скорость чтения данных. Я недавно читал про настройку ONLINE для индекса, она влияет только на режим rebuild или reorganize?
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603264
Владислав Колосов,

Дык дэдлок же на родительском пк. На эти индексы в указанном коде шаредом никто не заходит.
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603266
egorrezchikov,

удалить надо FK
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603286
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorrezchikovМожет быть дело в NONCLUSTERED INDEX ?Точно! И как же мы раньше не догадались?
Хотя в графах нет ни единого упоминания о некластерных индексах, дело безусловно в них. Стопудово.

Вместо того, чтобы проанализировать планы запросов для понимания происходящего, или хотя бы выяснить почему же Data.CalculationFactor блокируется целиком, вы решили последовать вредным, но простым советам типа убиения индексов или FK.
Остается только пожелать вам успехов.
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603334
egorrezchikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

План запроса.
https://yadi.sk/d/a9K9DDoC3SUeRD
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603435
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorrezchikov,

Плохо, что планы оценочные, а не актуальные...
Возьмем дедлочащую инструкцию из первого графа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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'

Если фактический план совпадает с оценочным и, как вы писали, @CalculationId неизменен, то такого дедлока просто не может быть. Потому что в этой инструкции конкурирующие процессы не пересекаются по блокировкам на Data.Calculation.

Можно воспроизвестьи вашу ситуацию.
Создайте тестовые таблицы:
Код: sql
1.
2.
3.
4.
5.
6.
use tempdb;
go

create table dbo.t1 (id int primary key);
create table dbo.t2 (id int primary key, t1_id int not null references dbo.t1 (id));
go

Затем откройте в студии два соединения. В первом запустите
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
use tempdb;
set nocount on;
go

if @@trancount > 0
 rollback;
go

while 1 = 1
begin
 begin tran;
 insert into dbo.t1 values (1);

 insert into dbo.t2 values (1, 1) option (merge join);
 rollback;
end;

Во втором
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
use tempdb;
set nocount on;
go

if @@trancount > 0
 rollback;
go

while 1 = 1
begin
 begin tran;
 insert into dbo.t1 values (2);

 insert into dbo.t2 values (2, 2) option (merge join);
 rollback;
end;


В одном из соединений возникнет дедлок. Замените option (merge join) на option (loop join) и запустите еще раз - дедлока не будет.
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603536
invm,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
while 1 = 1
begin
 begin tran;
 insert into dbo.t1 with(paglock) values (1);

 insert into dbo.t2 values (1, 1) option (merge join);
 rollback;
end;
---
while 1 = 1
begin
 begin tran;
 insert into dbo.t1 with(paglock) values (2);

 insert into dbo.t2 values (2, 2) option (merge join);
 rollback;
end;
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603628
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и запустите еще ра,

И? Гарантируете расположение потенциально конфликтующих строк всегда на одной странице?
...
Рейтинг: 0 / 0
Помогите с deadlock PK Index
    #39603663
invm,
Конечно нет. Но так вполне себе веселей и дедлоков будет гораздо меньше. С учетом штучной вставки в CLUSTERED IDENTITY - вполне зашибись получится. И в каком-то смысле ближе к телу (имхо). Начнет массово делать и в разные диапазоны значений ПК - дедлоки будут, но в разы меньше чем сейчас. В случае с LOOPами при определенных сценариях другие вопросы могут возникнут характерные для лупов. Ну т.е. и так, и сяк можно. И там, и тут можно нарваться на то что работает оно "именно так как должно" и абсолютно конкретно, а не туманно волшебно.

Сделать это (попробовать PAGLOCK) можно было двумя страницами ранее, как говорится "не вдаваясь в подробности", поскольку природа и сценарий абсолютно типовые. Тем же можно лечить выражение MERGE со схожими симптомами, дополненными местными особенностями. И план выполнения не трогается (хоть тут и не то что бы актуально). Я с решением не спорю, а пытаюсь дополнить еще одним свидетельством того, что проблема связана именно с собиранием конкретных нужных строк. Ну, может, чуть-чуть продолжаю спорить про предложение поставить ROWLOCK, который почти полностью и является причиной конкретной проблемы.

Про удаление FK - абсолютно всерьез. Названия таблиц намекают на то что занимаются их наполнением роботы, в ХП все предельно понятно, транзакция есть. Чтобы порушить надо влезть целенаправленно руками. Оверхеды и нюансы - лицезреем в полный рост, смысла - скорее всего около нуля.

Ситуация у OP вполне конкретная, он уже трай-кэтчами дедлоки свои обернул ("ишь, как ухаживает. любит, наверное" (с) особенности рыбалки), хотя вырубив объективно (с учетом представленного) незадействованный механизм полностью может от них избавиться.
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с deadlock PK Index
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]