Klaus: Oracle-DB Listener geht ständig auf Block bei MSSQL-Prozedur

Beitrag lesen

Hi hotti,

Weder am Oracle-Server oder am MSSQL-Server noch an den Proceduren wurde etwas geändert (Das letzte Mal vor 7 Jahren).

Ein Überlegung erster Ordnung sagt mir, dass Du das eigentliche Problem seit 7 Jahren mit Dir rumschleppst.

Da liegst Du nicht falsch ;-)) Zu meiner Entschuldigung: Damals gab es noch einen internen DB-Admin, der sich bemühte. Nachdem dieser nicht mehr verfügbar war, ist das Problem geschoben worden. Weil es auch nur selten auftrat. Allerdings hätte man (ich) spätestens aktiv werden müssen, als man per crontab automatisch reagiert hat.

Hab ich auch schon erlebt, dass der Listener stirbt ohne Auauaa zu sagen. Syntax ok, aber es waren einfach zuviele Daten mit Stringoperationen. Da gibts in Oracle eine Begrenzung. Schau Dir die Daten an, die da bewegt werden, meine Lösung (ist schon par Jahre her) bestand darin, die Daten auf mehrere Statements aufzuteilen, was zwar mehr Netzwerktraffic erzeugte aber auf Dauer funktionierte.

Ich weiß nicht, wie ich eine der Update-Aufgaben auf mehrere Statements aufteilen könnte.
Hier exemplarisch ein Beispiel für eine Tabelle (von 36). Der Aufbau ist nahezu identisch bei allen.

  
	if (@tablename = 'T_AI_SPRACHE')  and exists (select 1 from oradoc..ORADOC.VIEW_T_AI_SPRACHE)  
	begin  
  
		select @updcount = 0,  
			 @inscount = 0,  
			 @actcount = 0,  
			 @error = 0  
  
		select @actcount = count(1)  
		from	oradoc..ORADOC.VIEW_T_AI_SPRACHE  
		where abs(lngSYNCID) > @syncid_mssql  
  
		update firma.myweb.T_AI_SPRACHE  
		set 	LNGSYNCID = s.LNGSYNCID,  
			LNGAUTOID = s.LNGAUTOID,  
			STRBESCHREIBUNG = s.STRBESCHREIBUNG,  
			INTREIHENFOLGE = s.INTREIHENFOLGE  
		from 	firma.myweb.T_AI_SPRACHE d join oradoc..ORADOC.VIEW_T_AI_SPRACHE s on d.INTAIID = s.INTAIID  
											and d.INTLANGID = s.INTLANGID  
		where   abs(s.lngSYNCID) between @syncid_mssql+1 and @syncid  
  
		select @error = @@error,  
			 @updcount = @@rowcount  
  
		If @error <> 0  
		Begin  
			Set @errortext = 'Fehler beim Update der Tabelle T_AI_SPRACHE'  
			exec firma.myoracle.sp_kut_import_error @p_error=@error, @p_errortext=@errortext  
		End  
		ELSE  
		BEGIN  
			set @updtext = @updtext + cast(@updcount as varchar(5)) + ' DS in T_AI_SPRACHE aktualisiert' + @crlf  
  
			insert into firma.myweb.T_AI_SPRACHE (  
				 INTAIID, LNGSYNCID, LNGAUTOID, INTLANGID, STRBESCHREIBUNG, INTREIHENFOLGE)  
			select INTAIID, LNGSYNCID, LNGAUTOID, INTLANGID, STRBESCHREIBUNG, INTREIHENFOLGE  
			from	 oradoc..ORADOC.VIEW_T_AI_SPRACHE s  
			where  not exists (select 1 from firma.myweb.T_AI_SPRACHE d where d.INTAIID = s.INTAIID  
										and d.INTLANGID = s.INTLANGID)  
  
			select @error = @@error,  
				 @inscount = @@rowcount  
  
			If @error <> 0  
			Begin  
				Set @errortext = 'Fehler bei Import der Tabelle T_AI_SPRACHE'  
				exec firma.myoracle.sp_kut_import_error @p_error=@error, @p_errortext=@errortext  
			End  
			ELSE  
			BEGIN  
  
				set @updtext = @updtext + cast(@inscount as varchar(5)) + ' DS in T_AI_SPRACHE eingefügt' + @crlf  
  
				if @updcount + @inscount = @actcount and @testflg = 0  
				begin  
					update oradoc..ORADOC.T_SYNCTABELLE set  
						syncid_mssql = @syncid,  
						aender_datum_mssql = getdate(),  
					      aender_bediener_mssql = user  
					where tabellenname = @tablename  
				end  
			end  
		END  
	end