Frage

Ein Kollege hat mich gebeten, bei Indizierung auf einigen Tabellen zu schauen, weil seine Abfrage sehr lange lief. Über eine Stunde.

select count(1)
from databaseA.dbo.table1
inner join databaseA.dbo.table2 on (table1.key = table2.key)
inner join databaseB.dbo.table3 on (table1.key = table3.key)

Beachten Sie die unterschiedlichen Datenbanken. Dies wurde von DatabaseB ausgeführt wird,

Die Tabellen 1 und 2 waren mehr als 2 Millionen Datensätze lang. Table3 hatte ein Dutzend Aufzeichnungen oder so.

ich an dem Abfrage-Plan sah und das Optimierungsprogramm beschlossen Nested-Loop-Indextabellen suchen in zu tun, 1 und 2 mit Table3 als Antriebstisch!

Meine erste Vermutung war, dass die Statistiken wurden schwer auf Tabellen 1 verkorkste & 2, aber vor der Aktualisierung Statistiken Ich habe versucht, das Hinzufügen einer Verknüpfungshinweis thusly:

select count(1)
from databaseA.dbo.table1
inner HASH join databaseA.dbo.table2 on (table1.key = table2.key)
inner join databaseB.dbo.table3 on (table1.key = table3.key)

Ergebnisse in 15 Sekunden zurück.

Da ich wenig Zeit war, ging ich um die Ergebnisse zu ihm zurück, aber ich mache mir Sorgen, dass dies in Problemen auf dem Weg führen kann.

Sollte erneut ich die Statistiken Problem und lösen Sie das Problem auf diese Weise? Könnte der schlechte Abfrage-Plan aus dem Join geführt hat, aus einer separaten Datenbanken zu sein?

Kann mir jemand ein paar Ideen bieten aufgrund Ihrer Erfahrung?

War es hilfreich?

Lösung

Ich würde die Statistik vermuten zuerst.

Wie Sie sicher wissen, Join Hinweise nur in 99% der Fälle und verwendet sollte vermieden werden, wenn Sie nachweisen, dass sie unbedingt erforderlich sind.

Andere Tipps

Überprüfen Sie Statistiken und Indizierung auf dem Tisch zuerst. Index Hinweise können zu Problemen führen. Wenn die Daten in den Tabellen ändert wird der Optimierer nicht in der Lage eines efficent Plan zu wählen, da Sie gezwungen haben es immer einen Hash zu verwenden.

Wäre es nicht eine verschachtelte Schleife die sachgemäßer sein? Nehmen Sie die 12 Datensätze aus der Tabelle 3, Spiel mit den 12 Datensätzen in der Tabelle 1 Match zu 12 Einträge in der Tabelle 2.

Ansonsten Ihre Hashverknüpfung würde erzwingen und Bestellung -. Bedeutet, dass Sie eine Million Datensätze aus Tabelle Hash würde 1 und Tabelle 2, dann kommen Sie zu den 12 Datensätzen in Tabelle 3

würde ich auf Statistiken suche sowohl die Pläne - und ich würde die Schleife vermute, kommt tatsächlich effizienter ist, wurde aber blockiert oder Ihre Hashverknüpfung wurde Vorteil im Cache gespeicherten Daten unter

.

Aber - ja -. In der Regel kommen Hinweise sind ein letztes Mittel

Eine langsam laufende Abfrage verknüpfte Server beteiligt haben könnte mit Sortierung zu tun. Sehen Sie hier für einige Hintergrundinformationen: http://blogs.msdn.com/psssql/archive/2008/02/14/how-it-works-linked-servers-and-collation-compatibility.aspx Der Hash-Join Hauch der sortorder zwingt, so dass die Leistungssteigerung erklärt.

Hier ist, wie die Optionen einzustellen:

EXEC master.dbo.sp_serveroption 
    @server=N'databaseA', 
    @optname=N'collation compatible', 
    @optvalue=N'true'

EXEC master.dbo.sp_serveroption 
    @server=N'databaseA', 
    @optname=N'use remote collation', 
    @optvalue=N'false'

-Edoode

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top