2 Stimmen

Messung der Leistung für einzelne oder mehrere Abfragen, wenn Sie eine große Anzahl von Brückentabellen haben

Ich fragte diese Frage um eine einzelne Verknüpfung oder mehrere (select n + 1) Abfragen

Ich wollte herausfinden, ob dies auch der Fall ist, wenn man zu viele Beziehungen und eine Menge von Brückentischen hat.

Hier sind zum Beispiel meine Tabellen:

Tabelle: Personen (ID, Vorname, Nachname, Alter, Telefon, etc . .)
Tabelle: Rollen (id, Name)
Tabelle: PeopleRoles (id, personID, roleID)
Tabelle: Fertigkeiten (id, name)
Tabelle: PeopleSkills (id, personID, skillID)

Wenn ich also eine Verknüpfung durchführe, erhalte ich mehrere Zeilen für jede Person (vorausgesetzt, eine Person hat viele Rollen oder mehrere Fähigkeiten).

wenn man davon ausgeht, dass es viele weitere Tabellen dieser Art mit vielen Beziehungen gibt, was schneller ist:

Option 1:

  1. Wählen Sie * aus Anwendungen
  2. dann in einer Schleife jede Anwendung durchlaufen und ein Select * from Roles where applicationID = id inner join ausführen

Option 2:

oder versuchen, eine massive Abfrage zu erstellen, die einen großen Ergebnissatz zurückgibt, und ich muss es dann normalisieren, wenn ich dies in Datenstrukturen übersetze (da ich die gleiche Anwendung in mehreren Zeilen natürlich erhalten werde.

4voto

Dave Markle Punkte 91733

Option 2 ist fast wird immer schneller sein, solange Sie nicht so viele doppelte Werte haben. Es hängt wirklich von der Größe der redundanten Daten ab - aber mehrere Select-Anweisungen sind bei einer großen Anzahl von Zeilen wirklich der Todesstoß, weil sie Schleifen bilden müssen und keine ausgefeiltere Art der Verknüpfung auf der Serverseite durchführen können, aber was vielleicht noch wichtiger ist - wenn Ihre Logik viele Datenbankaufrufe tätigt, geschehen diese über Prozess-/Netzwerkgrenzen hinweg, was an und für sich eine Größenordnung langsamer ist.

Es gibt andere Möglichkeiten, die Ergebnisse zu optimieren, wenn es wirklich, wirklich wichtig ist - Sie könnten die Datenbank einige XML erstellen lassen, die effizienter zwischen der Datenschicht und Ihrer Logikschicht serialisiert werden könnte, aber das ist eine Menge Arbeit und ist kaum das, was jemand plattformübergreifend oder generisch nennen würde.

Natürlich wirft das alles IMO die Frage auf... Warum nicht einfach ein ORM wie Linq to Entities oder Linq to SQL oder (N)Hibernate verwenden? Warum dieses Rad neu erfinden?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X