2 Stimmen

Count(*) mit NText-Spalte ist sehr sehr sehr langsam. Warum ist es so langsam? Und wie kann ich die Leistung verbessern?

Ich habe einige Probleme mit meiner SQL Server 2005-Datenbank. Ich habe eine Tabelle mit Auftragszeilen und jede Zeile hat eine NTEXT Feld namens XmlData . Ich möchte alle Felder zählen, in denen keine Informationen gespeichert sind. Ich verwende diese Abfrage:

SELECT Count(*) FROM [OrderLine] WITH(NOLOCK) 
WHERE [XmlData] NOT LIKE '' AND [XmlData] IS NOT NULL 

Die Tabelle hat 230.314 Datensätze und diese Abfrage dauert mehrere Minuten. Hat jemand von euch einen Tipp, wie man die Leistung steigern kann?

Hinweis: Ich kann den Typ der Spalte nicht ändern in nvarchar(max) Typ. Die NOLOCK war ein Tipp eines Kollegen.

Ich freue mich auf einige Tipps und Erklärungen.

4voto

Pent Ploompuu Punkte 5316

Um die teuren LOB-Lesevorgänge zu vermeiden, ersetzen Sie [XmlData] NOT LIKE '' con DATALENGTH([XmlData])>0 - DATALENGTH muss nicht den LOB-Wert jeder Zeile einlesen.

Wie bereits von anderen vorgeschlagen: Verwenden Sie nach Möglichkeit nvarchar(max) anstelle von ntext.

2voto

Gabriel Guimarães Punkte 2706

NTEXT ist veraltet, verwenden Sie stattdessen nvarchar(max) (beachten Sie xml ...).

Wenn Sie den Spaltentyp ändern, können Sie einen Index für die Spalte erstellen. Die Erstellung von Statistiken für die Spalte hilft SQL, den besten Weg für die Verwendung dieses Index zu finden.

Erstellen Sie Statistiken für die XMLData-Spalte, da diese eine Zuordnung von Werten erstellt, die die Anzahl der Abfragen deutlich erhöhen wird.

CREATE STATISTICS STATOrderLineXmlData
ON OrderLine (XmlData)
WITH FULLSCAN

Basierend auf der Antwort von @Pent sollten Sie Ihre Anfrage für diese ändern: Ersetzen Sie die Abfrage für diese:

SELECT Count(*) 
FROM [OrderLine] WITH(NOLOCK) 
WHERE [XmlData] IS NOT NULL 
AND DATALENGTH([XmlData]) > 0

Siehe dieser Link wenn Sie den Spaltentyp für nvarchar(max) ändern. Der Link enthält Informationen über ein kleines, kniffliges Update, das Sie durchführen müssen, um die Leistung nach der Spaltenänderung zu verbessern.

1voto

Randy Minder Punkte 45277

Zunächst einmal wird diese Abfrage eine Tabellendurchsuchung beinhalten. Das wird bei 230K Zeilen langsam sein. Sie können versuchen, NOT LIKE durch Length(XmlData) = 0 zu ersetzen, aber ich glaube nicht, dass das viel helfen wird. Andererseits bin ich mir nicht sicher, ob die Length-Funktion mit NText-Datentypen funktioniert. Ich glaube nicht, dass sie das tut, jetzt wo ich darüber nachdenke.

Das Fazit ist, dass Tabellenscans langsam sind, und der Umgang mit NText-Datentypen ist langsam. Sie haben hier also eine schlechte Kombination. Ich sehe hier nicht viel Raum für Verbesserungen, es sei denn, der Datentyp kann geändert werden.

Und ich bin sicher, Sie wissen, dass die Verwendung von WITH NOLOCK das Risiko birgt, unsaubere Daten zu lesen? Ja, es kann die Leistung verbessern, aber es ist nicht kostenlos. Sie könnten unbestätigte Änderungen lesen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X