Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Не секрет, что некоторые запросы могут приводить к деадлокам. У меня возник вопрос, а может ли это случиться когда план выполнения один и тот же?(надеюсь разработчики заложили одни и те же правила сортировки)
27 апр 18, 11:03    [21372963]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
для простоты будем считать что сложный запрос на удаление строк в таблице
27 апр 18, 11:09    [21372991]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
aleksrov
Member

Откуда:
Сообщений: 948
МуМу,

Нормально сформулируйте.
Причем чем тут один и тот же план? Если имеется ввиду один запрос, естественно может быть дедлок.
Бонально неоптимизированный update к примеру.
27 апр 18, 11:17    [21373032]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
aleksrov,

Один и тот же запрос(запрос на запрос), с update, с одним и тем же планом. Может быть deadlock?
27 апр 18, 11:20    [21373045]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
aleksrov
Member

Откуда:
Сообщений: 948
МуМу,

Что значит запрос на запрос?

Запустите на куче
Update Table set column2=Val
where column1 = Val
План один и тот же, отличаться будет только условие, может быть дедлок.
27 апр 18, 11:22    [21373051]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
aleksrov
МуМу,

Нормально сформулируйте.
Причем чем тут один и тот же план? Если имеется ввиду один запрос, естественно может быть дедлок.
Бонально неоптимизированный update к примеру.

он хотел сказать, возможна ли ситуация,
когда к дедлоку приводит один и тот же запрос,
выполненный из разных сессий,
план запросов один и тот же и "с виду" доступ к ресурсам идет в одном и том же порядке.

очевидно же, что никакие "правила сортировки, заложенные разработчиками"
не имеют отношения к вопросу, т.к. для дедлока сортировка вообще не нужна.
нужно минимум 2 ресурса и доступ к ним в разном порядке
27 апр 18, 11:22    [21373053]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Если бы я был разработчиком, вполне мог бы создать ситуацию когда это было бы невозможно(правда издержки могли бы быть больше от подобной выгоды). Вопрос, возник при споре с коллегами. Вопрос не практический, просто любопытно.
27 апр 18, 11:28    [21373079]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
aleksrov
Member

Откуда:
Сообщений: 948
МуМу,

Каждая система уникальна, разработчики не могут предсказать как она будет использоваться.
27 апр 18, 11:36    [21373107]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
ssms
Member

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


Да.
27 апр 18, 11:37    [21373117]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
МуМу
У меня возник вопрос, а может ли это случиться когда план выполнения один и тот же?(надеюсь разработчики заложили одни и те же правила сортировки)
Может.

Правила сортировки тут вообще ни при чем.
А одинаковость плана не означает, что его экземпляры не могут находится на разных этапах выполнения.
27 апр 18, 11:43    [21373160]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
invm,
Можно пример?
27 апр 18, 11:49    [21373198]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
invm,

собственно вопрос к этапам выполнения.
27 апр 18, 11:51    [21373214]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
МуМу,

Например, в плане есть Table Scan -> Sort -> ... -> Table Update. Блокировки уровня строки или таблицы. TIL RR или выше.
Один экземпляр на этапе Table Scan, другой - на Table Update. Соответственно, порядок обрабатываемых строк будет разным.
27 апр 18, 11:59    [21373260]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Что такое план- алгоритм более эффективно обрабатывающий данные. Есть этап предобработки статистики, своего рода компиляция. Если алгоритм просчитывает и идет по одним и тем же этапам, соблюдая сортировку и т.п., по идее деадлоков можно избежать теоретически.(для апдейта по одной таблице) Пока вопросы остаются, хотя возможно все просто.
27 апр 18, 12:03    [21373283]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
invm,

Эскалацию предположим уберем как внезапный фактор.
27 апр 18, 12:04    [21373293]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
aleksrov
Member

Откуда:
Сообщений: 948
МуМу,

Что вы пристали к этой сортировке.
Дедлок возникает когда запрос получает доступ к ресурсам в разном порядке. К примеру вы делаете сначала update строки 1, на нее наложена X до конца транзации, другой запрос делает update строки 2, также update до конца транзации, в первой транзакции потом делается неоптимизированный select (т.е. скан) во второй также, в итоге оба запроса хотят наложить S и ждут пока снимется X, ура дедлок! Причем тут сортировка? Причем тут план запроса?
27 апр 18, 12:12    [21373338]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
aleksrov,
spid 70 update A
spid 80 update B
spid 70 update B
spid 80 update A
вы об этом?;)
Один и тот же запрос на апдейт выполненный из разных сессий, приводящий к деадлоку, покажите мне пример.
27 апр 18, 12:18    [21373374]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
msLex
Member

Откуда:
Сообщений: 8091
МуМу,

Вам же уже 100 раз сказали: "Да, может"




Вот простой пример


--Создаем таблицу для тестов и заполняем ее 

create table dbo.TestDeadLock(
	id int not null primary key
	, f varchar(100)
)



insert dbo.TestDeadLock(
	id
)
select top 100 ROW_NUMBER() over(order by (select 1))
from sys.objects o1
cross join sys.objects o2


-- в двух параллельных потоках запускаем 

create table #test(
	id					int not null identity(1,1)
	, testdeadlock_id	int not null
	, primary key (
		id
	)
)

insert #test(
	testdeadlock_id
)
select id
from dbo.TestDeadLock
order by NEWID()



while 1=1
begin 
	update t2 set 
		f = newid()
	from #test t1 
	inner join dbo.TestDeadLock t2 with(forceseek) on t1.testdeadlock_id = t2.id 
end



наслаждаемся дидлоком в одной из сессий
27 апр 18, 12:20    [21373381]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
msLex,

Сортировки нет, а если с ней?(не могу проверить) Согласен, в моем случае были индексы уникальные(не сказал).
27 апр 18, 12:26    [21373406]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
msLex
Member

Откуда:
Сообщений: 8091
МуМу
msLex,

Сортировки нет, а если с ней?(не могу проверить) Согласен, в моем случае были индексы уникальные(не сказал).

Я не знаю что у вас там за "запрос" и что за уникальные индексы, но с каждым последующим вашим постом ваш изначальный вопрос


"Может ли запрос с одним и тем же планом выполнения создавать деадлок?"
превращается в
"Может ли запрос с одним и тем же планом выполнения не создавать деадлок?"
27 апр 18, 12:29    [21373419]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Вопрос был не правильно сформулирован. Тема закрыта;)
27 апр 18, 12:31    [21373423]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7768
МуМу,

любая параллельная обработка имеет право на дедлок.
27 апр 18, 13:01    [21373634]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Итог(кто понял).
Любые случайные события провоцируют деадлок. Например неупорядоченная куча(отсутствие индексов) , случайно включенная эскалация, параллелизм который вряд ли работает в одном порядке распределения. Может еще что то?
27 апр 18, 14:10    [21374076]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
МуМу
Любые случайные события провоцируют деадлок.
Дедлоки провоцируются несовместимым доступом к ресурсам в разном порядке. И ничем более.
27 апр 18, 14:28    [21374159]     Ответить | Цитировать Сообщить модератору
 Re: Может ли запрос с одним и тем же планом выполнения создавать деадлок?  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
МуМу
Итог(кто понял).
Любые случайные события провоцируют деадлок. Например неупорядоченная куча(отсутствие индексов) , случайно включенная эскалация, параллелизм который вряд ли работает в одном порядке распределения. Может еще что то?

Да. Курсор, а внутри update. А до него (апдейта одной строки) внутри цикла вычитка на клиента некоторых других строк select-ом, которая зависит от самочувствия клиента и скорости сети. Вы запустите миллион раз этот код, он сделает update для миллиона строк без дедлока. А на 1000001 раз очередной селект затормозит и внезапно Вы получите при попытке очередного апдейта дедлок. Из другой сессии, которая никогда раньше не мешала. Более того, Вы еще миллион раз прогоните тот же код в попытке разобраться - и не поймаете ни одного дедлока.

План - ничто (его сервер каждый раз для себя "рисует" на лету с целью оптимизации ресурсов прямо здесь и прямо сейчас, условия при этом всегда могут быть разные). Порядок выполнения паралелльных инструкций из разных сессий - всё. Вы - не единственный клиент реляционной БД и не работаете при этом с ней в одну сессию. А раз так - дедлоки неизбежны и необходимы. Чтобы оттестировать исключения на клиенте и логику повторной обработки и записи ошибок в отдельные таблицы для дальнейшего разбора полетов.
27 апр 18, 14:31    [21374177]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить