| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			
			Insert_recordset и временные таблицы в БД
			 
			
			Привет всем. 
		
		
		
		
		
		
		
	Недавно обнаружил любопытную вещь. Запросы вида insert_recordset ... select from в X++ При работы с БД зачем то используются временную табличку. Т.е. вместо того чтобы выполнить аналогичный запрос к БД, вначале создается временная табличка, затем в неё заливаются подобным запросом данные, а затем уже из времянки они переливаются в табличку получатель. (пример - тут \Data Dictionary\Tables\LedgerBalancesTransDelta\Methods\transferTempDeltaRecsToLedgerBalTrans ) Интересно, зачем так сделано ? К чему эти дополнительные костыли (ведь это только замедляет выполнение запроса) и возможно ли как-то отключить их использование? (Может быть есть какой нить хинт или настройка в реестре) У нас используется оракл и эти времянки после выполнения запроса не удаляются - приходится их периодически убивать вручную ![]() ![]() ![]() P.S. Речь идет об Ax2009  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: S.Kuskov (3). | |
| 
			
			 | 
		#2 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
 | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: Logger (3). | |
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Насколько я понимаю, связано это с генерацией и вставкой значения RecId. 
		
		
		
		
		
		
			Т.е. сначала сохраняются записи во временную таблицу - получается кол-во записей для вставки (при этом, recId присваивается увеличивающее значение, начиная с единицы). Затем, выделяется нужный диапазон в systemSequences Далее, происходит вставка в целевую таблицу, RecId присваивается значение из временной таблицы + смещение Если делать это все через прямую вставку в таблицу, то посчитать кол-во записей перед вставкой все равно придется, но между расчетом и вставкой пройдет какое-то время, за которое могут быть вставлены новая записи в исходную таблицу, соответствующие поисковому запросу. И значение в systemSequences разъедется с реальным в таблице. Что бы этого избежать, придется запускать сериализуемую транзакцию, которая очень легко может заблокировать всю исходную таблицу на момент операции (да и не сталкивался я в DAX с использованием таких транзакций) 
				__________________ 
		
		
		
		
	Axapta v.3.0 sp5 kr2  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: Logger (3). | |
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Спасибо за ответы. 
		
		
		
		
		
		
		
	Все прояснилось. Пожалуй отключать и не надо.  | 
| 
	
 | 
| 
	
	 | 
	
			 
			Похожие темы
		 | 
	||||
| Тема | Ответов | |||
| Временные таблицы и их временные файлы | 6 | |||
| insert recordset join таблицы без вывода поля | 7 | |||
| Вопрос по insert_recordset | 25 | |||
| Осторожно insert_recordset | 11 | |||
| Не работает Insert_Recordset | 21 | |||
		
  |