1

sql-server-2005 で (C フレーズを借用するために) いくつかの xml 構造体を作成する必要があります。これを行うために、すべての値を varchar に変更します。これらの値を使用したいときに問題が発生します。それらを10進数に変換する必要があります。

したがって、私の xml コードは次のようになります。

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

このようにして、VAL が null の場合、特別な 10 進数を返し、その 10 進数をチェックできます。これを行うことの欠点は、値を使用するときに相手側で合体を使用できないことです。変換された値が 0 に等しいかどうかを確認する必要があります。次のように:

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

現時点ではパフォーマンスが受け入れられないため、パフォーマンスを改善する方法の 1 つは、入れ子になった case ステートメントを使用する代わりに、coalesce を使用して、特別な「null」に相当する値と等しいかどうかをチェックすることではないかと考えました。

何かご意見は?

また、 select cast('null' as decimal(10,5)) が私に与えることがわかります:

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

1 に答える 1

1

パフォーマンスの問題は、さまざまな要因によって発生する可能性があります。

最初のものはSQL 2005でXMLを使用しています。使用しているxmlデータのサイズはわかりませんが、5年前にこれを試したときに、特定のサイズの壁を越えた場合(32kだったと思いますが、64kだったかもしれません) その後、処理パフォーマンスが崖から落ちました。1 バイト余分にあると、クエリが 500 ミリ秒から 60 秒に短縮されます。その時点で、SQL サーバーに XML データ自体を処理させることを断念しなければなりませんでした。その処理を C# で行う方がはるかに高速でした。

2 つ目は、select ステートメント内で関数を呼び出すことです。その関数が複数の行で動作する必要がある場合、パフォーマンスが低下します。これを説明するために私がいつも使用する例の 1 つは、GETDATE() です。変数を GETDATE() の戻り値に設定し、その変数を選択クエリで使用すると、クエリ自体で GETDATE() を呼び出すよりも桁違いに速く実行されます。あなたが提供した小さなコード例は、関数を呼び出しているという理由だけでキラーになる可能性があります.

これは差し迫った問題に対する適切な答えではないかもしれませんが、SQL サーバーから XML 処理コードをヤンクして、選択した他の言語で実行する方がはるかに優れていると私は信じています。

于 2011-01-03T16:09:05.297 に答える