2016-03-20 8 views
0

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 Config
  • Items Tabelle definieren, die jedes Element Informationen von Geräten aufzeichnet
  • Itemdata Tabelle, die Sensorwerte für jedes Element Zeile speichert, so Itemdata Tabelle ist verbunden mit Sensors und Items 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:

enter image description here

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?

+0

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. –

+0

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 –

+0

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. –

Antwort