读书人

视图的优化多谢各位了

发布时间: 2013-05-02 09:39:29 作者: rapoo

求一个视图的优化,谢谢各位了
求一个视图的优化,不管用什么办法也好,临时表,优化语句结构,存储过程等等,最好写出优化后的代码。
对于实际的需求,别问我,我不懂,帮朋友改的,他也不懂。


CREATE view [dbo].[v_ypjg_main_wypjg]
as
select 'x' as pjlx,lszh,spdm
,dwdm=(case when substring(dwdm,1,3)='DYF' then '80-PP' else dwdm end)
,dwmc,mxjls,xcljls,kcsjls,zhsmsj
,zfbz=(case when minclbz<-1 then 'y' else 'n' end)
,xclbz=(case when xcljls>0 then 'y' else 'n' end)
,kcsbz=(case when smlxs=1 and kcsjls>0 and kcsjls=xcljls then 'y' else 'n' end)
,smlx=(case when smlxs=1 and maxsmlx in ('销售出库','退货入库','抽检出库','销毁出库')then maxsmlx else '待定' end)
from(
select lszh,spdm,dwdm,dwmc
,max(smsj) as zhsmsj
,max(isnull(smlx,'')) as maxsmlx
,min(isnull(clbz,0)) as minclbz
,count(*) as mxjls
,count(case when isnull(clbz,0) in (0,1,2) then lszh else null end) as xcljls
,count(case when isnull(clbz,0)=2 and isnull(smlx,'')in('销售出库','退货入库','抽检出库','销毁出库') then lszh else null end) as kcsjls
,count(distinct (case when isnull(clbz,0)<0 then null else isnull(smlx,'') end)) as smlxs
from ypjg_xs_wypjg with(nolock)
where lszh not in (
select lszh from (
select distinct lszh,spdm,dwdm,dwmc
,kzbz=(case when isnull(spdm,'')='' or isnull(dwdm,'')='' or isnull(dwmc,'')='' then 1 else 0 end)
from ypjg_xs_wypjg with(nolock)
where isnull(clbz,0)>=0
)x
group by lszh having (count(*)>1 or max(kzbz)=1)
)
group by lszh,spdm,dwdm,dwmc having max(smsj)<convert(varchar(10),getdate(),126)
)y

union all

select 'g' as pjlx,lszh,spdm
,dwdm=(case when substring(dwdm,1,3)='DYF' then '80-PP' else dwdm end)
,dwmc,mxjls,xcljls,kcsjls,zhsmsj
,zfbz=(case when minclbz<-1 then 'y' else 'n' end)
,xclbz=(case when xcljls>0 then 'y' else 'n' end)
,kcsbz=(case when smlxs=1 and kcsjls>0 and kcsjls=xcljls then 'y' else 'n' end)
,smlx=(case when smlxs=1 and maxsmlx in ('采购入库','退货出库') then maxsmlx else '待定' end)
from (
select lszh,spdm,dwdm,dwmc
,max(smsj) as zhsmsj
,max(isnull(smlx,'')) as maxsmlx
, min(isnull(clbz,0)) as minclbz,count(*) as mxjls
,count(case when isnull(clbz,0) in (0,1,2) then lszh else null end) as xcljls
,count(case when isnull(clbz,0)=2 and isnull(smlx,'')in('采购入库','退货出库') then lszh else null end) as kcsjls
,count(distinct (case when isnull(clbz,0)<0 then null else isnull(smlx,'') end)) as smlxs
from ypjg_gj_wypjg with(nolock)
where lszh not in (
select lszh from (


select distinct lszh,spdm,dwdm,dwmc
,kzbz=(case when isnull(spdm,'')='' or isnull(dwdm,'')='' or isnull(dwmc,'')='' then 1 else 0 end)
from ypjg_gj_wypjg with(nolock) where isnull(clbz,0)>=0
)x
group by lszh having (count(*)>1 or max(kzbz)=1)
)
group by lszh,spdm,dwdm,dwmc having max(smsj)<convert(varchar(10),getdate(),126)
)y

GO


[解决办法]
这哪能看得出来啊,起码得给个执行计划吧
[解决办法]
可否先把数据放到临时表里面,然后视图从临时表里面取数据
[解决办法]
引用:
引用:可否先把数据放到临时表里面,然后视图从临时表里面取数据
什么都可以,放临时表里,存储过程取临时表也行。我是头都搞晕了,搞不出来,谢谢了
 select lszh,spdm,dwdm,dwmc
,max(smsj) as zhsmsj
,max(isnull(smlx,'')) as maxsmlx
,min(isnull(clbz,0)) as minclbz
,count(*) as mxjls
,count(case when isnull(clbz,0) in (0,1,2) then lszh else null end) as xcljls
,count(case when isnull(clbz,0)=2 and isnull(smlx,'')in('销售出库','退货入库','抽检出库','销毁出库') then lszh else null end) as kcsjls
,count(distinct (case when isnull(clbz,0)<0 then null else isnull(smlx,'') end)) as smlxs
from ypjg_xs_wypjg with(nolock)
where lszh not in (
select lszh from (
select distinct lszh,spdm,dwdm,dwmc
,kzbz=(case when isnull(spdm,'')='' or isnull(dwdm,'')='' or isnull(dwmc,'')='' then 1 else 0 end)
from ypjg_xs_wypjg with(nolock)
where isnull(clbz,0)>=0
)x
group by lszh having (count(*)>1 or max(kzbz)=1)
)
group by lszh,spdm,dwdm,dwmc having max(smsj)<convert(varchar(10),getdate(),126)


比如说 把这一段数据放到临时表里面,然后从这个临时表中去数据,会不会好一点
[解决办法]
子查询太多,可以选择拆开来一步步实现,
把一些用函数(比如说substring(....))处理的步骤单独来做,然后再去判断

[解决办法]
首先T-SQL的性能的提升跟什么建临时表,SP没有什么必然的联系,性能的好坏看计划,计划的本质看算法,由于你不提供计划,我不知道你具体的那些操作符之间的算法是什么.
只能猜了,你一下下面的

1,对lszh 建 INDEX ,
2,对 clbz建INDEX ,
3,把2句 select lszh from ( 改为 select TOP (2147483647) lszh from (
4 把 where isnull(clbz,0)>=0 改为 where clbz >=0 or clbz is null


祝你好运。

[解决办法]
把 not in 修改成外连接 and 对应值=null
[解决办法]
引用:
把 not in 修改成外连接 and 对应值=null


首先not in 跟外连接 and 对应值=null在语义上不不等的, 只有not exists 才跟跟外连接 and 对应值=null在语义上相等,而通过算法理论跟实现都可以来证明,not exists 的性能永远大于或者等于外连接 and 对应值=null,见过各种SQL SERVER的 MVP 有这种误解。
[解决办法]
视图的优化,多谢各位了
1、考虑是否必须用视图。
2、执行计划最大的那些是啥操作
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

1、考虑是否必须用视图。
2、执行计划最大的那些是啥操作

性能的好坏跟是否用视图好像没有必然的联系吧
有,视图是运行时在编译的,并且由于存在需要刷新视图,所以不要,刷新视图可以看:http://blog.csdn.net/dba_huangzj/article/details/8426684


能不能说详细一点“视图是运行时在编译的” 是指什么?只指VIEW里的T-SQL在真正执行之前不会对其进行编译,而是在真正运行的时候才编译它,还是指其他的什么?
[解决办法]
1.你可以将这张视图 按照功能拆分成几个不同部分 在做关联 [你不妨可以尝试一下]

2.构建视图索引

[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

1、考虑是否必须用视图。
2、执行计划最大的那些是啥操作

性能的好坏跟是否用视图好像没有必然的联系吧
有,视图是运行时在编译的,并且由于存在需要刷新视图,所以不要,刷新视图可以看:http://blog.csdn.net/dba_huangzj/article/details/8426684


能不能说详细一点“视图是运行时在编译的” 是指什么?只指VIEW里的T-SQL在真正执行之前不会对其进行编译,而是在真正运行的时候才编译它,还是指其他的什么?
运行视图就是运行里面的T-SQL,这个时候再进行编译的。失去了存储过程这些“缓存”特性


不是这样的,
举个例子,
Use [AdventureWorks2008R2]
go

CREATE VIEW [dbo].[View_X]
AS
SELECT [Production].[Product].*
FROM [Production].[Product]
Where [ProductNumber]='FR-M94B-42

开启SQL profiler,选择showplan all for query compile ,showplan all 2个事情
然后执行Select * From [dbo].[View_X]
会发现按如下顺序产生3个事件,
showplan all for query compile
SQL:Batchstarting
showplan all

再次执行Select * From [dbo].[View_X] ,会发现showplan all for query compile 没有了,只有下面2个事件,
SQL:Batchstarting
showplan all
这就证明2个事情
1,VIEW里的T-SQL 同样也是在真正执行之前编译的。
2,VIEW里的T-SQL 同意享受SP “缓存”的特性,其实在05开始,计划的“缓存”在AD-HOC里也支持。
你可以用性能计数器,用这两个计数器:
1、SQL Server:SQL Statistics:SQL Compilations/sec
2、SQL Server:SQL Statistics:SQL Re-Compilations/sec

然后用你给出的例子创建以后,再执行select * from视图,可以看到每次你执行,SQL Compilations/sec这个计数器就会动一下,证明它发生了编译操作

读书人网 >SQL Server

热点推荐