Die Verbesserung der performance auf einen Blick mit einer MENGE von joins
Habe ich eine Ansicht, die verwendet 11 outer-joins und zwei inner joins um die Daten zu erstellen. Dies resultiert in über 8 Millionen Zeilen. Wenn ich ein count (*) auf dem Tisch, dauert es etwa 5 Minuten zu laufen. Ich bin an einem Verlust, wie die Leistung dieser Tabelle. Hat jemand irgendwelche Vorschläge, wo zu beginnen? Es gibt Indizes auf alle Spalten, die den Beitritt (obwohl einige composit, nicht sicher, ob das einen Unterschied macht...)
Jede Hilfe dankbar.
- haben Sie schaute auf die geschätzten/tatsächlichen Ausführungsplan? Sie werden Ihnen sagen, wenn Sie fehlt ein index irgendwo
- Ich sah Sie an. Es gibt keine Tabelle durchsucht, die nehmen jede bedeutende Zeit. Es gibt eine Menge von "Hash-Matches", die zu schlechter Leistung, aber Hash-matches werden nur dann ausgeführt, wenn die Indizes werden verwendet, richtig?
- einen trick fand ich sehr nützlich, zu brechen, eine komplexe Abfrage in Unterabfragen, z.B. wenn Sie eine Abfrage mit 11 Verknüpfungen - es ist eine harte Arbeit für Optimierungstools, die im Allgemeinen nicht in der Lage, unter Berücksichtigung von mehr als 4 Verknüpfungen auf einmal. Ich würde versuchen zu halten äußeren Abfrage mit 4 joins andere Verknüpfungen zu Unterabfragen. Hat mir geholfen, in ein paar Fällen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist ein hartes, mit einer komplexen Ansicht, die Sie auch mögliche Wechselwirkungen mit Abfragen auf die view, also die Gewährleistung angemessener Leistung wird sehr schwierig sein. Outer-joins in views (vor allem komplexe) sind auch anfällig für Probleme für die Abfrage-Optimierer.
Eine option wäre, erst die Ansicht (so genannte "indizierte sichten" auf SQL-Server). Allerdings müssen Sie möglicherweise überwachen, aktualisieren Sie die Leistung und prüfen, ob er nicht verhängen zu viel overhead. Auch, outer-joins in eine materialisierte Ansicht kann ausschließen, dass real-time aktualisieren; wenn Sie dies benötigen, dann müssen Sie möglicherweise zu re-implementieren Sie die Ansicht als eine denormalised Tabelle und pflegen Sie die Daten für die Trigger.
Andere Möglichkeit wäre zu prüfen, ob die anzeigen könnten aufgeteilt werden in zwei oder drei einfachere Ansichten, möglicherweise materialisieren einige, aber nicht alle der Ansicht. Es kann einfacher sein, zu konkretisieren einige der anzeigen und Holen Sie sich die Leistung vom system Weg.
Ihre grundlegende Prämisse ist falsch.
mit einem Blick, das gibt 8 Millionen Zeilen ist nicht eine gute Idee, weil realisticaly Sie können nicht wirklich etwas tun mit so viel Daten.
5 Minuten klingt ziemlich gut für 8 Millionen count (), weil alle diese Verknüpfungen.
was Sie tun müssen, ist denken Sie über Ihre business-problem und schreiben Sie eine kleinere Abfrage/view.
Ein paar Dinge, die Sie in Betracht ziehen könnte:
Führen Sie die sql profiler/index tuning-Assistenten. manchmal macht es index-Empfehlungen, die nicht sofort Sinn machen, aber haben wunderbare perf Vorteile
Vielleicht einige der Tabellen, die Sie versuchen, (outer) join disjunkt sind? Wenn dem so ist, sollten Sie das erstellen der gespeicherten Prozedur anstatt der anzeigen und erstellen Sie so etwas wie dieses:
select ...
into #set1
from T1 left join T2 left join...
where ...
select ...
into #set2
from T3 left join T4 left join...
where ...
...
select ... from #set1 left join #set2 left join ...
Mit dabei, können Sie vermeiden, Verarbeitung von großen Datenmengen. Wenn Sie outer-joins, optimizer oft nicht bewegen Auswahl nach unten in der parse-Baum der Abfrage (wenn es das getan, gäbe es keine Zeilen mit null-Werte, die Sie wahrscheinlich wollen)
Natürlich können Sie nicht erstellen, Abfrage mit verbinden mit gespeicherten Prozedur. Dies ist nur eine grundlegende Idee, die Sie verwenden können.