SqlServer的CASE,JOIN使用优化一例

SqlServer的CASE,JOIN使用优化一例,第1张

概述同事提了个意见过来,说写的一个视图,查询比较慢,看能不能优化下。视图主体内容: SELECT distinct * FROM (SELECT dbo.FGetParentsProj(PROJECT_ID) AS Parents FROM dbo.TPROJECT WHERE (PROJECT_BUDGET = 'Y') AND (PROJ 同事提了个意见过来,说写的一个视图,查询比较慢,看能不能优化下。视图主体内容:
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使用优化一例所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1178745.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存