powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с deadlock PK Index
15 сообщений из 40, страница 2 из 2
Помогите с 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
15 сообщений из 40, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с deadlock PK Index
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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