Jump to content

Ermittlung rekursiver Verbindungen


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo allerseits,

 

ich muss aus einem Datenbestand rekursive Verbindungen zwischen rund 3 Mio. Datensätzen ermitteln.

 

Die Quelltabelle beinhaltet 2 Nummern (Quelle und Ziel) - Beispiel:

1 - 2

1 - 3

2 - 4

2 - 5

3 - 1

3 - 4

6 - 7

7 - 8

9 - 1

Ziel ist es nun alle mit einander verbundenen Nummern mit einer gemeinsamen Nummer zu kennzeichnen, d.h.

1 - 2 = 01

1 - 3 = 01

2 - 4 = 01

2 - 5 = 01

3 - 1 = 01

3 - 4 = 01

6 - 7 = 02

7 - 8 = 03

9 - 1 = 01

Mein Problem ist die Rekursion (siehe 1 verbunden direkt mit 2,3 und über 2 mit 4,5 und über 3 mit 1,4). Für die Rekursionstiefe gibt es keine Beschränkung. Alle miteinander verbundenen Daten sollen nachher durch eine gemeinsame Nummer verbunden sein.

 

Hier mein derzeitiger Source-Code

 

ALTER PROCEDURE [dbo].sp_wolke --@intIdx INT = 0

 

AS

BEGIN

 

DECLARE @int_WOLKE INTEGER = 1

DECLARE @int_REKURSIONSTIEFE INTEGER = 1

DECLARE @int_LAUFEN_A INTEGER = 1

DECLARE @int_LAUFEN_B INTEGER = 1

DECLARE @int_AUFRAEUMEN INTEGER = 1

 

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tb_TEMP_BEZIEHUNGEN_ERG]') AND type in (N'U'))

DROP TABLE tb_TEMP_BEZIEHUNGEN_ERG

SELECT * INTO tb_TEMP_BEZIEHUNGEN_ERG FROM tb_temp_beziehungen_test WHERE WOLKEN_NR > 0

WHILE @int_LAUFEN_A = 1

BEGIN

UPDATE tb_temp_beziehungen_test

SET WOLKEN_NR = @int_WOLKE

FROM tb_temp_beziehungen_test

WHERE Source_int = (SELECT TOP(1) Source_int FROM tb_temp_beziehungen_test WHERE WOLKEN_NR = 0)

IF @@ROWCOUNT = 0

BEGIN

SET @int_LAUFEN_A = 0

SET @int_LAUFEN_B = 0

END

ELSE

SET @int_LAUFEN_B = 1

 

WHILE @int_LAUFEN_B = 1

BEGIN

UPDATE tb_temp_beziehungen_test

SET WOLKEN_NR = @int_WOLKE,

REKURSION = @int_REKURSIONSTIEFE

FROM tb_temp_beziehungen_test x

WHERE WOLKEN_NR = 0 AND

EXISTS (SELECT 1 FROM tb_temp_beziehungen_test y

WHERE y.WOLKEN_NR = @int_WOLKE AND (x.Source_int = y.Dest_int OR x.Dest_int = y.Dest_int))

IF @@ROWCOUNT = 0

BEGIN

SET @int_LAUFEN_B = 0

SET @int_WOLKE = @int_WOLKE + 1

SET @int_AUFRAEUMEN = @int_AUFRAEUMEN + 1

SET @int_REKURSIONSTIEFE = 1

END

ELSE

SET @int_REKURSIONSTIEFE = @int_REKURSIONSTIEFE + 1

END

IF @int_AUFRAEUMEN > 1000

BEGIN

DELETE FROM tb_temp_beziehungen_test OUTPUT deleted.* INTO tb_TEMP_BEZIEHUNGEN_ERG WHERE WOLKEN_NR > 0

SET @int_AUFRAEUMEN = 1

END

END

DELETE FROM tb_temp_beziehungen_test OUTPUT deleted.* INTO tb_TEMP_BEZIEHUNGEN_ERG WHERE WOLKEN_NR > 0

END

 

 

Für 100.000 Quelldatensätze läuft diese Routine ca. 30 Minuten. Bei 3 Mio Datensätzen sind nach 12h noch nicht mal 40.000 Sätze verarbeitet.

 

Ich hoffe das alles ist soweit verständlich und über eine interessante Diskussion komme ich auf eine performante Lösung.

bearbeitet von FischiFisch
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...