powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Принудительный ordered scan по временной таблице
25 сообщений из 62, страница 2 из 3
Принудительный ordered scan по временной таблице
    #39879906
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосовinvm - хорошим будет тот способ, который не использует сортировки и хинты, т.к. они не являются обычной практикой.Хорошим будет способ, который обеспечивает наиболее эффективное решение, а не наиболее соответствующий догмам.
И вы так и не ответили в чем профит перекладывания во временную таблицы в данном конкретном случае.

TaPaKсдаюсь.При параллельной вставке updlock+holdlock гарантирует отсутствие дубликатов.
Либо отсутствие ругани о нарушении уникальности, если есть уникальный индекс
Либо отсутствие предупреждения, если есть уникальный индекс с IGNORE_DUP_KEY = ON

msLexRange локи накладываются на предыдущую записьНа следующую.
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39879908
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
msLexRange локи накладываются на предыдущую записьНа следующую.

точно, все время путаю.
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39879909
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

я же писал - в чем профит. Не нужна неочевидная стороннему разработчику сортировка в запросе и не требуется поддерживать сортировку в новых запросах. Кроме того, можно не перекладывать, а удалить лишнее.
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39879912
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmВладислав Колосовinvm - хорошим будет тот способ, который не использует сортировки и хинты, т.к. они не являются обычной практикой.Хорошим будет способ, который обеспечивает наиболее эффективное решение, а не наиболее соответствующий догмам.
И вы так и не ответили в чем профит перекладывания во временную таблицы в данном конкретном случае.

TaPaKсдаюсь.При параллельной вставке updlock+holdlock гарантирует отсутствие дубликатов.
Либо отсутствие ругани о нарушении уникальности, если есть уникальный индекс
Либо отсутствие предупреждения, если есть уникальный индекс с IGNORE_DUP_KEY = ON

msLexRange локи накладываются на предыдущую записьНа следующую.
почему не накладывать это на получатель?
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39879916
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосовя же писал - в чем профит. Не нужна неочевидная стороннему разработчику сортировка в запросе и не требуется поддерживать сортировку в новых запросах. Кроме того, можно не перекладывать, а удалить лишнее.


Слишком много слов, давайте вы на примере покажите как без not exists вы решаете следующую задачу

есть таблица
Код: sql
1.
create table dbo.dict(id int not null primary key) 



нужно реализовать процедуру
Код: sql
1.
create proc dbo.dict_add


принимающую на вход список id и добавляющую в dbo.dict, те что отсутствуют.
процедура вызывается во много потоков, входящие id в разных потоках могут совпадать.


для простоты (что бы не генерить дополнительных сущностей), список id будет # таблица
Код: sql
1.
create table #t(id int not null primary key) 


создаваемая и заполняемая вне этой процедуры
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39879918
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKinvmпропущено...
Хорошим будет способ, который обеспечивает наиболее эффективное решение, а не наиболее соответствующий догмам.
И вы так и не ответили в чем профит перекладывания во временную таблицы в данном конкретном случае.

пропущено...
При параллельной вставке updlock+holdlock гарантирует отсутствие дубликатов.
Либо отсутствие ругани о нарушении уникальности, если есть уникальный индекс
Либо отсутствие предупреждения, если есть уникальный индекс с IGNORE_DUP_KEY = ON

пропущено...
На следующую.
почему не накладывать это на получатель?

потому что между exists (или left join) и insert проходит достаточно времени, чтобы другой поток вставил отсутствующие записи
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39879944
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLexTaPaKпропущено...

почему не накладывать это на получатель?

потому что между exists (или left join) и insert проходит достаточно времени, чтобы другой поток вставил отсутствующие записи
т.е. две транзакции в serializable на получателе смогут вот в тот фокус про достаточно времени?
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39879949
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKт.е. две транзакции в serializable на получателе смогут вот в тот фокус про достаточно времени?

конечно, можете проверить
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39879953
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLexTaPaKт.е. две транзакции в serializable на получателе смогут вот в тот фокус про достаточно времени?

конечно, можете проверить
а разве не сразу получение всех блокировок, а потом выполнение?
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39879958
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLexTaPaKт.е. две транзакции в serializable на получателе смогут вот в тот фокус про достаточно времени?

конечно, можете проверить


вот вам простой репро

создаем таблицу справочник
Код: sql
1.
create table dbo.dict(id int not null primary key) 




и в двух (уже достаточно) потоках запускаем конкурентную вставку с serializable на получателе

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
declare @id int = 0

while 1=1
begin
	begin tran
	begin try
		/*выбираем id+1 ключ для имитации конкурентной вставки*/
		select top 1 
			@id = id+1
		from dbo.dict
		order by 
			id desc


		insert dbo.dict with(holdlock, rowlock, updlock) (
			id
		) 
		select 
			@id
		where 
			not exists (
				select *
				from dbo.dict
				where 
					id = @id
			)
		commit tran
	end try
	begin catch 
		rollback tran
		;throw 
	end catch 
end 



переносим хинты ниже и снова запускаем в двух сессиях

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
declare @id int = 0

while 1=1
begin
	begin tran
	begin try
		/*выбираем id+1 ключ для имитации конкурентной вставки*/
		select top 1 
			@id = id+1
		from dbo.dict
		order by 
			id desc


		insert dbo.dict  (
			id
		) 
		select 
			@id
		where 
			not exists (
				select *
				from dbo.dict with(holdlock, rowlock, updlock)
				where 
					id = @id
			)
		commit tran
	end try
	begin catch 
		rollback tran
		;throw 
	end catch 
end 
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39879965
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKа разве не сразу получение всех блокировок, а потом выполнение?


нет, конечно.
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39879969
Cristiano_Rivaldo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если требуется исключить повторяющиеся - то почему бы не повесить уникальный констрейнт на таблицу ?
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39879970
Cristiano_Rivaldo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cristiano_Rivaldo,

Ничего лочить не надо будет. И дублей гарантированно не будет...
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39879971
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cristiano_RivaldoЕсли требуется исключить повторяющиеся - то почему бы не повесить уникальный констрейнт на таблицу ?
и откатывать всю транзакцию, при его нарушении?
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39879974
Cristiano_Rivaldo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
msLex,

Нужно написать грамотный блок обработки ошибок
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39879975
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосовя же писал - в чем профит. Не нужна неочевидная стороннему разработчику сортировка в запросеДля заботы о стронних разработчиках придумали комментарии.
Владислав Колосовне требуется поддерживать сортировку в новых запросах.Зачем ее там поддерживать?
Владислав КолосовКроме того, можно не перекладывать, а удалить лишнее.Задача - добавить из источника строки, отсутствующие в целевой таблице.
Что тут лишнее, которое можно удалить?
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39879977
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cristiano_RivaldomsLex,

Нужно написать грамотный блок обработки ошибок

до блока ошибок, вставка в таблицу уже откатится
если вставлять одну запись, вроде и не так жалко (хотя это уже двойная вставка в лог)
а если за раз нужно вставить отсутствующие из 10000 входящих записей и вставка упадет из-за 1-й последней записи?
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39879982
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex,

при многопоточности должны быть очереди в любом проявлении - блокировки страниц или блокировки уровня приложения. Позвольте мне воздержаться от написания примера, мозг и так взрывается :) Ищу решение для каскадного удаления.
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39879985
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Зачем ее там поддерживать?

Вот в этом и вопрос - разве одновременной выполнение другого запроса к этой же таблице не будет потенциальным источником взаимоблокировок? В нем ведь последовательность наложения блокировок не будет упорядоченной.
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39879986
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex,

Да вы правы, спасибо. В последнее время на такое просто вешаем игнор и фиг с ним
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39879988
Cristiano_Rivaldo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
msLex,

Да - от ошибки нарушения уникальности никуда не денешься...
Но есть практики,которые позволяют заинсертить большое количество данных в максимально короткое время.
Чем быстрее завершится insert - тем меньше шансов на дубли.
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39879990
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmЗадача - добавить из источника строки, отсутствующие в целевой таблице.
Что тут лишнее, которое можно удалить?

Поясню. Во временной таблице находится набор потенциально избыточных данных, это следует из запроса ниже, который фильтрует эти избыточные данные. Если избыточные данные удалить из временной таблице перед вставкой и исключить из запроса фильтр, то проблема взаимоблокировок не появится.
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39879992
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовmsLex,

при многопоточности должны быть очереди в любом проявлении - блокировки страниц или блокировки уровня приложения.

т.е. блокировки уровня ключей вас не устраивают, а страницами пожалуйста



Владислав КолосовПозвольте мне воздержаться от написания примера, мозг и так взрывается :)
Я не в коем случае не заставляя вас, просто хотелось понять на примере простого кода о чем вы говорите.
Мне до сих пор не понятно как вы решаете проблему многопоточной конкурентной вставки в уникальный ключ.
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39879995
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cristiano_RivaldomsLex,

Да - от ошибки нарушения уникальности никуда не денешься...

денешься. один из вариантов показан выше
...
Рейтинг: 0 / 0
Принудительный ordered scan по временной таблице
    #39880000
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKmsLex,

Да вы правы, спасибо. В последнее время на такое просто вешаем игнор и фиг с ним
Если мы на такое повесили бы игнор, у нас бы ошибки уникальности падали бы раз в 5 минут.
...
Рейтинг: 0 / 0
25 сообщений из 62, страница 2 из 3
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Принудительный ordered scan по временной таблице
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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