Gibt es eine Alternative zu der SQL Server STUFF
-Funktion?SQL Server STUFF Zeichenfolge Concat langsam
Ich entwickle einen Windows-Dienst, der eine Datenbank durchläuft und einige Daten verarbeitet, aber der Schritt zum Abrufen von Daten ist extrem langsam.
Ich habe diese Tabellen
Sensors
Tabelle, die Sensoren ConfigItems
Tabelle definieren, die jedes Element Informationen von Geräten aufzeichnetItemdata
Tabelle, die Sensorwerte für jedes Element Zeile speichert, soItemdata
Tabelle ist verbunden mitSensors
undItems
Tabellen
Ich muß die Daten aus Elementen auszuwählen mit itemsdata als col wie diese
1=5|2=6|
Gruppierung ich diesen T-SQL verwenden - es funktioniert gut, aber es ist langsam mit mehr als 200.000 Zeilen.
Ohne sie ist exec extrem schnell
Mit tatsächlichem Ausführungsplan es 99% in der stuff
Funktion übernehmen:
Ich bin mit dem folgenden TSQL
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
IF (@dtFrom IS NOT NULL AND @dtTo IS NOT NULL)
BEGIN -- with both dates
SELECT
m.itemsId,
m.ObjectId,
0 AS [type],
STUFF((SELECT
(CAST(Sensors.SourceNameId AS nvarchar(10)) + '=' + CAST(t.Value AS nvarchar(20)) + '|')
FROM [tavl2].[tavl].[itemsData] t WITH (NOLOCK)
LEFT JOIN tavl2.tavl.Sensors WITH (NOLOCK) ON t.SensorsId = Sensors.SensorsId
WHERE t.itemsId = m.itemsId
FOR xml PATH (''), TYPE).value('.[1]', 'nvarchar(max)'), 1, 0, '') AS params
FROM
tavl.[items] m WITH (NOLOCK)
WHERE
m.ObjectId = @objId
AND m.GpsTime BETWEEN @dtFrom AND @dtTo
AND m.Valid = 1;
END
Irgendwelche besseren Lösungen?
Während es keinen Zweifel langsam tun, können Sie nicht Verwenden Sie die tatsächliche Nummer aus dem Ausführungsplan, wenn XML darin enthalten ist (und auch ohne - die Zahlen sind Richtlinien). Sie müssen auf Statistiken für die tatsächlichen Nummern zugreifen. Es fällt mir jedoch schwer zu erkennen, warum Sie die Daten in der Datenbank anstatt in Ihrer Serviceebene verketten, da es mehr nach Präsentation als nach Abfragedaten aussieht. –
Ich verwende eine Verkettung, um die Anzahl der Schleifen und Daten zu reduzieren, da jedes Element 10 Itemdaten haben kann und jede Abfrage 200.000 Item haben kann, so wird es 200.000 * 10 Loop zu verketten –
Sie sind definitiv nicht Schleifen durch Verketten in diesem reduzieren Art und Menge der Daten scheint kein Faktor zu sein, da Sie die gleichen Daten auswählen und die Daten eher gering sind. Das Iterieren von mehr als 200.000 Zeilen im Code sollte kein Problem sein, verglichen mit dem, was Sie in der Datenbank erreichen möchten - insbesondere wenn Sie so etwas tun. SQL ist eine relationale Datenbank, und wenn Sie diesen Aspekt nicht verwenden (set-based operations), sind Sie in 9 von 10 Fällen besser dran, wenn Sie anderswo arbeiten. –