首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

小弟我的视图效率很高,但是在它的基础下加下统计函数就慢了很多

2012-08-10 
我的视图效率很高,但是在它的基础上加上统计函数就慢了很多。SELECT DISTINCTISNULL(A.kaicode, 0)AS kaico

我的视图效率很高,但是在它的基础上加上统计函数就慢了很多。
SELECT DISTINCT 
  ISNULL(A.kaicode, 0) AS kaicode,
  ISNULL(A.dennumb, 0) AS dennumb,
  CONVERT(char(7), A.denymd, 120) AS denymdx,
  ISNULL(A.ukecode, 0) AS autcode,
  ISNULL(A.ukecode, 0) AS ukecode,
  ISNULL(A.ukename, '') AS ukename, 
  CAST(CONVERT(char(10), A.denymd, 120) AS datetime) AS denymd,
  ISNULL(c.kmkkubn, 0) AS kmkkubn, 
  ISNULL(A.gyou, 0) AS gyou,
  ISNULL(A.kmkcode, 0) AS kmkcode,
  ISNULL(A.hojcode, 0) AS hojcode, 
  ISNULL(A.bumcode2, 0) AS bumcode2,
  ISNULL(A.kmkcode2, 0) AS kmkcode2, 
  ISNULL(A.hojcode2, 0) AS hojcode2, 
  ISNULL(A.tekname, '') AS tekname, 
  ISNULL(B.kainame, '') AS kainame,
  B.kessans,
  B.kessane,
  ISNULL((SELECT ISNULL(SUM(zenzan), 0) FROM kekbhojzan
WHERE (kaicode = A.kaicode) AND
(kmkcode = A.kmkcode) AND 
(hojcode = A.hojcode) AND 
(bumcode = A.bumcode) AND 
(CONVERT(char(7), kymd, 120) = CONVERT(char(7), A.denymd, 120))), 0)
  AS zenzanb, 
  ISNULL((SELECT ISNULL(SUM(zenzan), 0) FROM kekhojzan
  WHERE (kaicode = A.kaicode) AND 
  (kmkcode = A.kmkcode) AND 
  (hojcode = A.hojcode) AND 
  (CONVERT(char(7), kymd,120) = CONVERT(char(7), A.denymd, 120))), 0) AS zenzan, ISNULL(A.bumcode, 0) 
  AS bumcode,  
  ISNULL((SELECT ISNULL(money1, 0) FROM keksiwdat 
WHERE (taikubn = 1) AND
(kaicode = A.kaicode) AND 
(dennumb = A.dennumb) AND 
(denymd = A.denymd) AND 
(gyou = A.gyou)), 0) 
  AS money1,
  ISNULL((SELECT ISNULL(money1, 0) FROM keksiwdat 
WHERE (taikubn = 2) AND 
(kaicode = A.kaicode) AND 
(dennumb = A.dennumb) AND 
(denymd = A.denymd) AND 
(gyou = A.gyou)), 0) 
  AS money2,
  ISNULL((SELECT ISNULL(bumname, '') FROM kekbummst
  WHERE (kaicode = A.kaicode) AND
  (bumcode = A.bumcode)), '')
  AS bumname, 
  ISNULL((SELECT ISNULL(bumname, '') FROM kekbummst 
  WHERE (kaicode = A.kaicode) AND 
  (bumcode = A.bumcode2)), '') 
  AS bumname2,
  ISNULL((SELECT ISNULL(hojname, '') FROM kekhojmst
  WHERE (kaicode = A.kaicode) AND
  (kmkcode = A.kmkcode) AND 


  (hojcode = A.hojcode)), '') 
  AS hojname, 
  ISNULL((SELECT ISNULL(hojname, '') FROM kekhojmst 
  WHERE (kaicode = A.kaicode) AND
  (kmkcode = A.kmkcode2) AND
  (hojcode = A.hojcode2)), '') 
  AS hojname2, 
  ISNULL((SELECT ISNULL(kmkname, '') FROM kekcommst
  WHERE (kmkcode = A.kmkcode)), '') 
  AS kmkname, 
  ISNULL ((SELECT ISNULL(kmkname, '') FROM kekcommst 
  WHERE (kmkcode = A.kmkcode2)), '') 
  AS kmkname2  
  FROM keksiwdat AS A LEFT OUTER JOIN
  kekkaimst AS B ON A.kaicode = B.kaicode LEFT OUTER JOIN
  kekhojmst AS D ON A.hojcode = D.hojcode AND A.hojcode2 = D.hojcode AND A.kaicode = D.kaicode LEFT OUTER JOIN
  kekcommst AS E ON A.kmkcode = E.kmkcode AND A.kmkcode2 = E.kmkcode LEFT OUTER JOIN
  kekbummst AS F ON A.bumcode = F.bumcode AND A.bumcode2 = F.bumcode AND A.kaicode = F.kaicode LEFT OUTER JOIN
  kekauthead AS h ON A.kaicode = h.kaicode LEFT OUTER JOIN
  kekcommst AS c ON c.kmkcode = A.kmkcode INNER JOIN
  kekkmkmst AS I ON A.kaicode = I.kaicode AND A.kmkcode = I.kmkcode
  WHERE (I.hojumu <> 0)

这个视图叫做 view_0900
这个很快
然后我又在外边嵌套语句如下
效率很低这是为什么呢?
select * , 
isnull((select sum(isnull(money1,0)) from view_0900 where kaicode=t1.kaicode and bumcode=t1.bumcode and denymd between t1.kessans and t1.kessane and kmkcode =t1.kmkcode and hojcode =t1.hojcode),0) as bsummoney1 ,
isnull((select sum(isnull(money2,0)) from view_0900 where kaicode=t1.kaicode and bumcode=t1.bumcode and denymd between t1.kessans and t1.kessane and kmkcode =t1.kmkcode and hojcode =t1.hojcode ),0) as bsummoney2,
isnull((select sum(isnull(money1,0)) from view_0900 where kaicode=t1.kaicode and denymd between t1.kessans and t1.kessane and kmkcode =t1.kmkcode) ,0) as summoney1 ,
isnull((select sum(isnull(money2,0)) from view_0900 where kaicode=t1.kaicode and denymd between t1.kessans and t1.kessane and kmkcode =t1.kmkcode),0) as summoney2  
from
view_0900 as t1


[解决办法]
你用了嵌套语句了 当然慢很多。
[解决办法]

SQL code
select *from view_0900 as t1cross apply(    select        sum(money1) as bsummoney1,        sum(money2) as bsummoney2    from view_0900    where        kaicode = t1.kaicode and        bumcode = t1.bumcode and        denymd between t1.kessans and t1.kessane and        kmkcode = t1.kmkcode and        hojcode = t1.hojcode) t2cross apply(    select        sum(money1) as summoney1,        sum(money2) as summoney2    from view_0900    where        kaicode = t1.kaicode and        denymd between t1.kessans and t1.kessane and        kmkcode = t1.kmkcode) t3
[解决办法]
问一下,你视图执行的时间是多少,然后数据返回大概是多少;如果视图很快,并且数据量很小的话,可以先Insert到临时表,然后再统计,因为当视图用在多个统计时,会将视图定义引入sql语句,重新编译执行计划。
[解决办法]
借助临时表进行处理效率会很高的。

热点排行