Sollte man mehrere Querys aus Tabelle schachteln?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    Sollte man mehrere Querys aus Tabelle schachteln?

    Hallo,

    würdet ihr Querys schachteln wenn möglich?

    Beispiel:
    Nicht Schachteln:

    VB.NET-Quellcode

    1. Dim q1 = From t in DS1.testtable Where condition1 AndAlso condition2 AndAlso condition3
    2. Dim q2 = From t in DS1.testtable Where condition1 AndAlso condition2 AndAlso condition4
    3. Dim q3 = From t in DS1.testtable Where condition1 AndAlso condition2 AndAlso condition5


    Schachteln:

    VB.NET-Quellcode

    1. Dim qbase = From t in DS1.testtable Where condition1 AndAlso condition2
    2. Dim q1 = From t in qbase Where condition3
    3. Dim q2 = From t in qbase Where condition4
    4. Dim q3 = From t in qbase Where condition5


    Viele Grüße

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Ok, mittlerweile habe ich meine Queries voll ausgefüllt, und konnte feststellen es beeinflusst die Performance auch maßgeblich.

    Bei den Queries gibt es ja diese Ausführungsverzögerung, da war ich mir nicht sicher, ob man da vielleicht in die Bredouille kommt.

    Zum Beispiel kriege ich hier nochmal doppelte Geschwindigkeit wenn ich die Query außerhalb der Schleife vorab abrufe, innerhalb der Schleife hingegen verschlechtert das abrufen der qbest ins Array die Geschwindigkeit:

    VB.NET-Quellcode

    1. Dim qbase = (From t In DS1.base Where basecondition).ToArray
    2. For Each row In DS1.Werte
    3. Dim qbest = From t In qbase Where t.ParentID = row.ParentID
    4. Dim q1 = (From t In qbest Where condition1).Count
    5. 'Dim q2 = (From t In qbest Where condition2).Count
    6. row.BestehtAus = q1
    7. Next

    Dieser Beitrag wurde bereits 13 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    ja - gute Code-Verbesserung.
    Deine neue Variante sieht mir danach aus, als ob qbest eine Parent-Child-Relation verfolgt. Da käme dann vielleicht auch noch eine generierte typisierte .GetChildRows()-Methode inFrage. Aber egal - wird an dieser Stelle auch nix messbares bringen.

    Man kann evtl. auch noch mehr treiben, aber das geht dann in Richtung Optimierung im engeren Sinne, also den (Geschwindigkeit-)Vorteil erkauft man sich durch Verschlechterung bei Lesbarkeit und Variabilität.
    DS1.base ist ein bisschen komisch. Die enthaltenen Objekte/Zeilen stehen in der eigentlichen Parent-Child Beziehung, nicht die Queries.
    Ich ziehe die Parent Objekte raus, und zähle die zugehörigen Child-Objekte. DS1.Werte sind dann nur noch die Parents

    Das kann man auch mit Self Joins irgendwie hinkriegen glaub ich, aber ich brauch die Daten noch für andere Sachen, deswegen hab ich das noch nicht versucht.
    Bild vom Dataset wäre vlt. hilfreich.
    Irgendwie komisch: Scheinbar gleichst du die Primärschlüssel (ID) zweier Tabellen gegeneinander ab.
    Ein Fremdschlüssel sollte ja keinesfalls ID heissen.
    Daher versteh ich eigentlich garnet, was vor sich geht.

    Die Rede von enthaltenen Objekten - Nicht-Queries, die in Parent-Child Beziehung stehen, und Parent-Objekte rausziehen, versteh ich auch nicht.
    Vor allem wo ich nicht weiss, was womit in Beziehung steht, und was dabei Parent und was Child ist.
    Wie gesagt: Bildle...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ich habe Artikelgruppen, wo eine Artikelgruppe andere Artikelgruppen enthalten kann.
    Eine Artikelgruppe, die in einer anderen Artikelgruppe enthalten ist, hätte ich jetzt als Child der enthaltenden Parentgruppe betitelt.


    Das Bild hilft nicht viel, ID ist nicht der Primärschlüssel sondern nur die ParentID.

    Also base ist einfach ein bissle blöd organisiert, die hat einige Sachen mehrfach drin.
    Beispiel:
    Die Gruppe 1 wäre ParentID = 1, ChildID = 0 und die enthält die Gruppen ParentID = 1, ChildID = 1, ParentID = 1, ChildID = 2, ParentID = 1, ChildID = 3
    Diese Gruppen gibt es außerdem nochmal in base als ihre eigene Parentgruppe, die wären also identisch mit ParentID = 23, ChildID = 0, ParentID = 67, ChildID = 0, ParentID = 34, ChildID = 0




    Das wären jetzt nur zwei Generationen.
    (Da muss man sich jetzt nochne ChildChildID usw. vorstellen für noch mehr Generationen.)
    Die ganze Zuordnung ist erstmal nicht so wichtig, ich muss erstmal nur wissen welche Artikelgruppe wieviele Gruppen eine Generation tiefer enthält.

    Werte enthält schon alle Gruppen, die Childs haben weiß aber nicht wieviele.
    qbase filtert so wie Werte schon gefiltert ist. Ich brauche ja keine Gruppen anschauen die keine Childs haben, denn die gibts in Werte eh nicht.
    qbest guckt für die ParentID 1 in base und bekommt 4 Zeilen zurück,
    dann wird q1 = 3 daraus machen.
    q2, q3, q4 gibts im Beispiel nicht, wegen Vereinfachung. Hab ich im Code auch mal rausgenommen, weil auch ohne das man die Redundanz vermeidet hat sich das Schachteln ja gelohnt.

    Haudruferzappeltnoch schrieb:

    Ich habe Artikelgruppen, wo eine Artikelgruppe andere Artikelgruppen enthalten kann.
    Eine Artikelgruppe, die in einer anderen Artikelgruppe enthalten ist, hätte ich jetzt als Child der enthaltenden Parentgruppe betitelt.
    Das klingt ein bischen wie eine Relation der Tabelle mit sich selbst.
    Da kann man u.U. auch eine richtige DataRelation für etablieren.
    Man spricht auch von einer rekursiven Relation, und ausserdem ergeben sich daraus baum-strukturen.

    Aber vielleicht hast du da auch iwie ein davon abweichendes Konstrukt gebastelt - zB verstehe ich nicht, warum base zwei PK-columns zu haben scheint.
    Also wenn ich eine rekursive Datenstruktur aufbaue, dann heisst der PK ID - wie immer, und der (selbstbezügliche) FK heisst ParentID.
    Also die base tabelle kann ich nicht ändern oder so, das ist fest vorgegeben, und die braucht den Primärschlüssel auf beiden Spalten, weil der ja eindeutig sein muss.

    Und da geht auch langsam inne Richtung wo ich nicht hinterkomme, habe sowas nicht zum ersten Mal.

    Ja das kann man sich gut als Baumstruktur vorstellen. In Werte soll jede Verzweigung auftauchen und in wieviele Teile diese sich verzweigt.