SELECT distinct * FROM (SELECT dbo.fgetParentsProj(PROJECT_ID) AS Parents FROM dbo.TPROJECT WHERE (PROJECT_BUDGET = 'Y') AND (PROJECT_ACTIVE = 'Y')) AS A inner JOIN dbo.TPROJECT ON A.Parents liKE '%▓' + dbo.TPROJECT.PROJECT_ID + '▓%'涉及到的函数fgetParentsProj内容:
CREATE FUNCTION [dbo].[fgetParentsProj] (@ID nvarchar(50)) RETURNS nvarchar(2000) AS BEGIN declare @result nvarchar(2000),@parentID nvarchar(50)select @result=''if(@ID != null)beginselect @parentID = PROJECT_PARENT_PRJ from TPROJECT where PROJECT_ID=@ID if(@parentID != '') set @result = '▓' + dbo.fgetParentsProj(@parentID)+'▓' + @ID + '▓'else set @result = '▓' + @ID + '▓'endreturn @result END看了下表TPROJECT,数据量也不大33条,但是执行时间却较多:
set statistics time ongo
分析:
这个视图还算简单,没有出现那种像文章一样的复杂视图和函数,理了下思绪,这个视图有以下几点可以优化:
1.使用case代替自己写的函数fgetParentsProj,这个函数就是一个判断值是否为空的作用
2.去掉inner join,或者使用left join,测试发现去掉inner join更快一点(这个是查询慢的罪魁祸首)
3.去掉inner join 后面的查询条件
4.去掉distinct,这点是基于表字段PROJECT_ID是主键字段
最后优化后的查询语句:
select case PROJECT_PARENT_PRJ when '' then '▓' + PROJECT_ID + '▓' else '▓' + PROJECT_PARENT_PRJ+'▓' + PROJECT_ID + '▓' end as parents,* from dbo.TPROJECT where PROJECT_BUDGET = 'Y' AND PROJECT_ACTIVE = 'Y'
优化后的执行时间: 总结
以上是内存溢出为你收集整理的SqlServer的CASE,JOIN使用优化一例全部内容,希望文章能够帮你解决SqlServer的CASE,JOIN使用优化一例所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)