Mehrere Abfragen zu vermeiden Beitritt?
Habe ich bemerkt, sobald ich die zusätzlichen Verknüpfungen zu einigen meiner Fragen die Zeit, die zum ausführen dieser war mehr als nur das ausfüllen von mehreren Abfragen.
Zeit gehören das laden der Seite und gemittelt über 20-Seite geladen.
7-9 Abfragen ohne joins
159ms
3 Abfragen mit 2 Verknüpfungen
235ms
Sollte ich gehen Sie einfach weiter mit mehreren Abfragen anstelle des joins bedenkt Sie scheinen zu haben eine bedeutende Auswirkung auf die Leistung? Kann ich wohl noch optimieren, die mehrere query-Methode, da war ich auch lazy loading bei den Prüfungen.
BEARBEITEN
Werde ich einige falsche Informationen zum Wohle der Frage.
Tabelle Objekte
ID (int, identity -, PK -, clustered-index)
UserID (int, nicht gruppierter index)
CategoryID (int, nicht gruppierter index)
Tabelle Benutzer
ID (int, identity -, PK -, clustered-index)
Tabelle Kategorien
ID (int, identity -, PK -, clustered-index)
Ziemlich einfach. Es ist eine Doppel-inner-join-Abfrage auf die Objekte der Tabelle. Die Abfrage aller 3 getrennt scheint schneller zu sein als die Verknüpfung.
Den Abfrageplan für die Verknüpfung zeigt 42% getan für 2 clustered index wird versucht, die 23% ist ein clustered index scan und der rest ist eine Top N-Sortierung.
- Vielleicht posten die lästigen Abfragen helfen würde...
- Haben Sie getestet, die falsch-schema, das Sie uns Gaben, um sicher zu sein es auch Erfahrungen der Verlangsamung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie Verknüpfungen für die kein Grund, sicher. In der Regel der Grund, warum man das verknüpfen von Tabellen ist in der Lage, ziehen Sie Verwandte Daten und befassen sich mit ihm. Ihre Frage oben nicht auch unter Berücksichtigung der programmatischen Zeit, die Sie gehen zu müssen, um zu ziehen, dass die Daten wieder zusammen (wahrscheinlich über eine loop-Struktur oder sowas).
Query-Analyse sollte der erste Schritt sein, hier. Ich bin nicht sehr vertraut mit Ihren besonderen Geschmack von SQL, aber es würde wahrscheinlich so etwas wie ERKLÄREN.
Wenn ich zu geben hatte einen wahrscheinlich Schuldigen, basierend auf den begrenzten Informationen, die ich hier habe, wäre es für fehlende Indizes. Sind die Felder beitreten Sie sind auf indizierte richtig? Dies kann garner RIESIGE performance-Gewinne. Zweitens sind Sie der Beitritt auf den richtigen Feldern? Zum Beispiel, wenn Sie das verbinden von zwei strings zusammen, Ihre Leistung ist viel schlimmer als der Beitritt zu einer Ganzzahl-oder andere optimiert Feld.
Nein, Sie sollten wirklich versuchen, zu gehen die andere Weise statt. Sie sollten versuchen, so wenige queries wie möglich. Wenn es richtig gemacht, dass ist die Schnellste.
Sicher, dass du die richtigen Indizes für die Tabelle. Zum Beispiel für eine Abfrage wie diese:
Sollten Sie sicherstellen, dass es ist ein index, der die TableB.Id-Feld. Der primary key einer Tabelle bekommt normalerweise einen index von Standard -, aber auch andere Indizes, die Sie haben, um sich selbst erstellen.
Ich empfehle Ihnen Blick auf die eigentliche Suchanfrage, zu planen und zu verstehen, warum die Reaktionen unterschiedlich. Vielleicht wird es markieren Sie eine Tabelle Scannen, Vorschlag hinzufügen eines index vielleicht?
Tun joins sind teurer. Dass bedeutet nicht, sollten Sie Sie nicht benutzen obwohl.
Helfen würde, um zu sehen, die SQL-Sie schreiben... (produziert von LINQ to SQL)
Haben Sie versucht mit Ihren Abfragen mit joins durch den analyzer, um zu sehen, ob es etwas gibt, was Sie tun, um Sie zu optimieren?
wenn Sie diese nur, um Daten in query analyzer dann mehrere Abfragen in Ordnung ist, aber wenn Sie Sie von einem web-app oder Konsole app, dann werden Sie wollen zu optimieren um 1 Abfrage. Auch wenn es länger dauert, werden Sie sehen, Gewinne in der Leistung, da Sie nicht auf Ihre Datenbank mehr als einmal. Je weniger Sie schlagen Ihre db, desto besser ist Ihre front-end-Leistung. Ich würde arbeiten, um re-tun Sie Ihre Abfragen werden nur eine. Es sieht aus wie Ihre Tische sind, normalisiert und indexiert genug, dass Sie sollten in der Lage sein, um es bis zu einer Abfrage.
Ich würde versuchen, um loszuwerden, alle typischen Verknüpfungen. Zum Beispiel würde ich ändern:
durch diese: