0

私は次の声明を継承しました。

SELECT ISNULL((SELECT (-1)*SUM(CAST(ISNULL(NULLIF(TOTALMTDLCY,''),0) AS DECIMAL(20,5))) 
FROM TI),0) 

何をしようとしているのかはわかっていますが(null値を防ぎ、0を返す)、これを行うにはもっとパフォーマンスの高い方法が必要だと思いますか?

その理由は、このステートメントを 12 回使用して、40,000 人の顧客 (480,000) の異なるテーブルから値を取得し、それぞれに 3 つのレコード (1.5M) を挿入する sproc があるためです。

これが完了するまでに約 13 分かかります。プロセスに関するいくつかの簡単な統計を収集して合計すると、12 のステートメントにかかった実際の時間は 00:00.015 ですが、合計時間は約 10 分であることがわかります。

ですから、このプロセスを高速化できれば、sproc を高速化できると思いますか?

4

3 に答える 3

1

数値を格納するために varchar を使用しないでください。悲しみの原因となるだけです。すべての値を varchar から decimal にキャストするのはコストがかかります。

次のようにテーブルを変更します

update TI set TOTALMTDLCY = null where TOTALMTDLCY = ''
alter table TI alter column TOTALMTDLCY DECIMAL(20,5) null

これで問題なく選択できます

select isnull(-sum(TOTALMTDLCY), 0) from TI
于 2012-09-18T11:27:07.607 に答える
0

これが機能する場合は、これを試すことができます..

SELECT (-1) * SUM(ISNULL(CAST(TOTALMTDLCY AS DECIMAL(20,5)),0)) FROM TI WHERE TOTALMTDLCY <> ''

PS: 現在、SQL サーバーにアクセスできないため、まだ検証していません。

于 2012-09-18T11:24:32.440 に答える
0
SELECT 
ISNULL(
  -(SELECT SUM(CAST(TOTALMTDLCY as DECIMAL(20,5))) 
     FROM TI where TOTALMTDLCY<>'')
  ,0) 
于 2012-09-18T11:26:05.643 に答える