Announcement

Collapse
No announcement yet.

Join-Verknüpfung zweier Tabellen dauert sehr lange

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Join-Verknüpfung zweier Tabellen dauert sehr lange

    Hallo Zusammen,

    ich versuche zwei sehr große Tabellen über die Datumspalte miteinander zu verknüpfen (siehe Anhang 1 und 2 als Beispiel).

    Die Tabellen Lager_1 (300000 Zeilen) und Lager_2 (600000 Zeilen) sind Sichten mit Schemabinding und deren Datumspalten sind indiziert.

    Die Verknüpfung sieht wie folgt aus:
    Code:
    CREATE VIEW [dbo].[New_Join_View]
    AS
    SELECT	b.datum as Datum,b.Menge as D_Menge,a.Menge as S_Menge
    
    FROM dbo.Lager_2 a LEFT OUTER JOIN dbo.Lager_1 b ON a.zeit = b.datum
    
    GO
    Wenn ich nun eine Abfrage starte, dauert es minutenlang...!

    Hat jemand eine Idee, wie man das performanter machen könnte ?

    Danke für jeden Lösungsansatz

    Gruß

    Robin
    Attached Files

  • #2
    Ich würde einfach Mal aus dem Bauch und meiner Erfahrung heraus sagen, dass Sichten grundsätzlich relativ träge sind.

    Eine Sicht über zwei Sichten zu machen, die sehr gross sind, dauert vermutlich einfach eine gewisse Zeit.

    Vielleicht kannst du versuchen die Tabellen als Nativ-Tabellen zu führen. Dies ist immer um einges Perfomanter.

    Vielleicht haben andere noch bessere Ideen.

    Comment


    • #3
      Aus meiner Sicht würde ich den Join umdrehen

      Code:
      CREATE VIEW [dbo].[New_Join_View]
      AS
      SELECT	b.datum as Datum,b.Menge as D_Menge,a.Menge as S_Menge
      FROM dbo.Lager_1 b LEFT OUTER JOIN dbo.Lager_2 a ON a.zeit = b.datum
      GO
      außer du willst echt alle 600k Lager2-Teile auflisten, was ich aus der Abfrage eigentlich nicht sehe.

      Dann könntest du noch Indezes erstellen auf die Tabellen. Würde denke ich ein bisschen schneller laufen.

      Grüße

      Comment


      • #4
        Hallo Robin,

        wenn der Zeitpunkt dein einziger Index ist und innerhalb einer Sekunde mehrere Datensätze vorhanden sind,
        werden mit deiner bisherigen Methode Kreuzprodukte erzeugt.

        Ich würde deshalb je Tabelle zuerst eine Mengensumme je Zeit bilden und dann erst vergleichen.

        Brauchst du nur die Mengen bei der die Zeit übereinstimmt (INNER JOIN)
        oder auf jeden Fall alle Mengen aus Lager2 (LEFT JOIN),
        bzw. alle aus Lager1 (RIGHT JOIN)?

        Also so:

        [highlight=SQL]CREATE VIEW [dbo].[New_Join_View]
        AS

        SELECT
        Lager2.zeit
        ,Lager2.S_Menge
        ,Lager1.D_Menge
        FROM
        (SELECT
        zeit
        ,SUM(Menge) AS S_Menge
        FROM dbo.Lager_2
        --WHERE zeit between 'von' AND 'bis'
        GROUP BY
        zeit
        )Lager2
        INNER JOIN
        (SELECT
        datum
        ,SUM(Menge) AS D_Menge
        FROM Lager_1
        --WHERE datum between 'von' AND 'bis'
        GROUP BY datum
        )Lager1
        ON Lager2.zeit = Lager1.datum
        [/highlight]
        Und Falk Prüfer sprach: Formatierung von SQL in Beiträgen

        Comment

        Working...
        X