2012-09-18 19 views
0

我继承了下面的语句ISNULL(NULLIF(...))语句的T-SQL的性能:如何提高含

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

,尽管我知道它的努力做(防止空值和返回0)我觉得必须有一个更高效的方式来做到这一点?

原因是我有一个sproc使用这个语句12次从40,000个客户(480,000)获取不同表中的值,然后为每个(1.5M)插入三条记录。

这需要大约13分钟才能完成 - 通过对过程收集了一些简单的统计和汇总他们来说,这表明,虽然采取了12个财务报表的实际时间是00:00.015,总时间因此约为10分钟。

所以,我的想法是,如果我可以加快这个过程,那么我可以加快我的sproc?

+0

什么是'TOTALMTDLCY'的数据类型? –

+0

varchar(25)不幸:( – BlueChippy

+2

ISNULL和NULLIF不是你的perf问题的原因,你为什么认为这些函数的原因是什么? – usr

回答

1

你不应该使用varchar来存储数值,它只会导致你的悲伤 。将varchar中的所有值转换为十进制代价都很高。

改变你的表像

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

现在您可以选择没有问题

select isnull(-sum(TOTALMTDLCY), 0) from TI 
+0

对不起,无法更改表格.. 。恐龙已经存在,并且有很多其他进程正在运行:( – BlueChippy

+1

)如果无法更改表格,则无法调整脚本。您可以稍微更改脚本,但性能基本上是一样的 –

0

你可以试试这个,如果它的工作原理..

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

PS:我目前不访问SQL Sever的所以还没有尚未验证它。

0
SELECT 
ISNULL(
    -(SELECT SUM(CAST(TOTALMTDLCY as DECIMAL(20,5))) 
    FROM TI where TOTALMTDLCY<>'') 
    ,0)