2 Stimmen

Verwendung von Linq-to-SQL-Preload ohne Joins

Wie viele andere versuche ich, die beste Leistung aus meiner Anwendung herauszuholen und gleichzeitig den Code so einfach und lesbar wie möglich zu halten. Ich verwende Linq-to-SQL und versuche wirklich, meine Datenschicht so deklarativ wie möglich zu halten.

Ich gehe davon aus, dass SQL-Aufrufe die teuersten Operationen sind. Daher versuche ich, sie quantitativ zu minimieren, aber verrückte komplexe Abfragen zu vermeiden, die schwer zu optimieren sind.

Ein Beispiel: Ich verwende DataLoadOptions mit meinem DataContext - sein Ziel ist es, die Anzahl der Abfragen zu minimieren, indem verwandte Entitäten vorgeladen werden. (Aka, eager loading vs. lazy loading.)

Problem: Linq verwendet Joins, um das Ziel zu erreichen. Wie bei allem, ist es ein Kompromiss. Ich erhalte weniger Abfragen, aber diese verbundenen Abfragen sind komplexer und teurer. Ein Blick in den SQL Profiler macht dies deutlich.

Ich hätte also gerne eine Option in Linq, um Vorspannung ohne Fugen . Ist das möglich? So könnte es aussehen:

J'ai un Persons Tabelle, eine Items Tabelle, und eine PersonItems Tabelle, um eine Viele-zu-Viele-Beziehung herzustellen. Wenn ich eine Sammlung von Personen lade, möchte ich auch alle ihre PersonItems und Items eagerly geladen haben.

Linq macht dies derzeit mit einer großen Abfrage, die zwei Joins enthält. Mir wäre es lieber, wenn es drei Abfragen ohne Joins machen würde: eine für Personen, eine für alle PersonItems, die mit diesen Personen zusammenhängen, und eine für alle Items, die mit diesen PersonItems zusammenhängen. Dann würde Linq sie automatisch in die entsprechenden Entitäten einordnen.

Jede dieser Abfragen wäre eine schnelle Abfrage nach Art eines Feuerschlauchs. Langfristig würde dies eine vorhersehbare Leistung im Web ermöglichen.

Haben Sie das schon einmal gesehen?

0voto

Simon Punkte 1479

Ich glaube, was Sie beschreiben, wo drei Nicht-Join-Abfragen durchgeführt werden, ist im Wesentlichen das, was unter der Haube passiert, wenn eine einzelne Join-Abfrage durchgeführt wird. Ich könnte mich irren, aber wenn dies der Fall ist, wird die einzelne Abfrage effizienter sein, da nur eine Datenbankabfrage im Gegensatz zu drei beteiligt ist. Wenn Sie Leistungsprobleme haben, würde ich sicherstellen, dass die Spalten, die Sie verknüpfen, indiziert sind (im SQL Profiler sollten keine Tabellenscans angezeigt werden). Wenn dies nicht ausreicht, können Sie eine benutzerdefinierte gespeicherte Prozedur schreiben, um nur die benötigten Daten abzurufen (vorausgesetzt, Sie benötigen nicht jede Spalte jedes Objekts, dann können Sie Indexabfragen nutzen, die schneller sind als Indexabfragen), oder Sie können alternativ denormalisieren (Daten in Ihren Tabellen duplizieren), so dass überhaupt keine Verknüpfung stattfindet.

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