2011-01-03 25 views
1

Ich habe eine Anforderung, einige XML-Strukturen (um eine C-Phrase zu borgen) in SQL-Server-2005 zu erstellen. Um dies zu tun, ändere ich alle meine Werte in varchar. Das Problem tritt auf, wenn ich diese Werte verwenden möchte, muss ich sie in Dezimal konvertieren.konvertieren 'Null' Varchar in Dezimal

So sieht mein xml-Code wie folgt aus:

set @result = @result + <VAL>' + coalesce(cast(@val as varchar(20)), '-.11111') + '</VAL>' 

auf diese Weise, wenn VAL null ist, kehre ich eine besondere dezimal und ich kann für diese dezimal überprüfen. Der Nachteil, dies zu tun, ist, dass ich nicht coalesce am anderen Ende verwenden kann, wenn ich den Wert verwenden, muß ich überprüfen, ob es Wert auf 0 wie dies gleich konvertiert ist:

case when cast(InvestmentReturn.fn_getSTRUCT(...args...).value('results[1]/VAL[1]', 'varchar(40)')as decimal(10,5)) = -.11111 

Seit Performance ist derzeit inakzeptabel. Ich dachte, eine Möglichkeit, die Leistung zu verbessern, wäre die Verwendung von Coalesce, anstatt eine geschachtelte case-Anweisung zu verwenden und den Wert für die Gleichheit mit meinem speziellen 'null'-Äquivalent zu überprüfen.

Irgendwelche Gedanken?

auch, ich sehe, dass select cast ('null' als Dezimalzahl (10,5)) gibt mir:

Msg 8114, Level 16, State 5, Line 1 
Error converting data type varchar to numeric. 

Antwort

1

Leistungsprobleme können durch eine Reihe von Faktoren verursacht werden.

Die erste verwendet XML in SQL 2005. Ich kenne nicht die Größe der XML-Daten, die Sie verwenden, aber als ich das vor 5 Jahren versuchte hätte 64k sein können), dann fiel die Verarbeitungsleistung von der Klippe. Ein zusätzliches Byte würde dazu führen, dass eine Abfrage von 500 ms auf 60 Sekunden wechselt. Wir mussten es aufgeben, SQL-Server selbst mit XML-Daten zu beschäftigen. Es war VIEL schneller, diese Verarbeitung in C# zu machen.

Der zweite Aufruf von Funktionen innerhalb einer SELECT-Anweisung. Wenn diese Funktion in mehreren Zeilen ausgeführt werden muss, sinkt die Leistung. Ein Beispiel, das ich immer benutze, um dies zu veranschaulichen, ist GETDATE(). Wenn Sie eine Variable auf die Rückgabe von GETDATE() setzen und dann diese Variable in einer Select-Abfrage verwenden, wird sie eine Größenordnung schneller ausgeführt als der Aufruf von GETDATE() in der Abfrage selbst. Das kleine Codebeispiel, das Sie zur Verfügung gestellt haben, könnte ein Mörder sein, nur weil es eine Funktion aufruft.

Dies ist vielleicht keine gute Antwort auf Ihr unmittelbares Problem, aber ich glaube wirklich, dass Sie viel besser gedient werden, jeden XML-Verarbeitungscode aus dem SQL-Server zu holen und es in ANDERER Sprache Ihrer Wahl zu tun.