Ich habe eine SQL Server 2008-Abfrage, die an Millionen von Datensätzen arbeitet. Die Abfrage befindet sich in einem Prozess, der jeden Abend von einem Job ausgeführt wird. Die Abfrage kann einen ganzen Tag dauern, wenn ich sie zum ersten Mal auf den Server stelle, aber innerhalb einer Woche oder so wird sie auf weniger als eine Stunde reduziert - ohne dass ich eingreifen muss. Es repariert sich irgendwie.
Die Abfrage wird in tempdb ausgeführt, und bevor sie sich selbst behebt, stelle ich beim Überprüfen der Leistungsstatistiken Folgendes fest: CXPACKET: 20.700 Sekunden oder 66% der Wartezeit.
PAGEIOLATCH: _SH 2.500 oder 8% der Wartezeit.
LOGBUFFER: 1500 Sekunden oder 5% der Wartezeit IO_COMPLETION: 1500 Sekunden oder 5% der Wartezeit
Ich habe versucht, Indizes usw. zu optimieren, und die obigen Statistiken sind eine Verbesserung gegenüber meinem ersten Lauf, als CXPACKET 77% der Wartezeit betrug. Ich habe Tipps zur Fehlerbehebung gelesen, die besagten, dass ich meine Tempdb für jede CPU in eine Datei aufteilen sollte. Ich habe ein 32-Bit-W2K8-System mit zwei CPUs und habe Tempdb in zwei Dateien aufgeteilt und die Größe von jeweils auf 150 GB pro 10% Autogrow stark erhöht, aber sie wachsen nicht, sodass ich denke, dass die Größe ausreichend ist.
Als ich mir den Server ansah, während die Abfrage ausgeführt wurde, konnte ich feststellen, dass die CPUs NICHT fixiert waren und etwa <10% ihrer Kapazität ausmachten. Was angeheftet wurde, war DISK IO. Die Maschine hat eine einzelne Festplatte.
Hier sind ohne weiteres die beiden Abfragen, die das Problem verursachen (die erste Abfrage war früher eine Unterabfrage der letzteren - siehe Erklärung unten):
insert into #ttcbm(tradeId1, tradeId2)
select distinct tp.tradeid tradeId1, tp1.tradeid tradeId2
from #tradeP tp
join #tradeP tp1
on tp.cmbId = tp1.cmbId
and tp.qs_plyrid = tp1.qs_plyrid
and tp.tradeId > tp1.tradeId
OPTION (MAXDOP 1)
insert into #mergeT(tradeId1, tradeId2)
select distinct tp.tradeid tradeId1, tp1.tradeid tradeId2
from #tradep tp
join #tradep tp1
on tp.cmbId = tp1.cmbId
and tp.tradeid > tp1.tradeId
left join #ttcbm x
on tp.tradeId = x.tradeId1
and tp1.tradeId = x.tradeId2
where 1 = 1
and x.tradeId1 is null
and x.tradeId2 is null
OPTION (MAXDOP 1);
Ich habe MAXDOP 1 pro Tipp zur Fehlerbehebung hinzugefügt, den ich gelesen habe, dass CXPACKET durch Parallelität verursacht wurde, und vielleicht hat es mir geholfen, meine Wartezeiten ein wenig zu verkürzen, aber nicht wie die Verbesserung, die auftritt, wenn sich die Abfrage selbst behebt, dh von 24 Stunden bis zum Ende als 1 Std.
Die Tabelle #ttcbm hat eine PK von tradeid1, tradeid2 und #tradep hat eine pk von (cmbId, qs_plyrid, tradeid) und beide Tabellen haben Datensatzzahlen in der Größenordnung von 100K bis 500k. #ttcbm war früher eine Unterabfrage der letzteren Abfrage "In #mergeT einfügen", aber ich habe sie getrennt, als ich las, dass das Trennen komplizierter Abfragen die Leistung verbessern kann, wenn Parallelität ein Problem darstellt.
dual cpu 32 bit W2K8
Zeit für ein Upgrade auf 64Bit. Haben Sie auch / 3GB Switch zusammen mit AWE aktiviert?