首页 新闻 赞助 找找看

SQL 优化问题

0
悬赏园豆:10 [已解决问题] 解决于 2015-05-20 15:39

在视图上,加上自定义标量值函数,执行的效率就很低下。大神们,如何去优化?

        SELECT ROW_NUMBER()OVER(ORDER BY p.ID) xuhao,BelongedTo,RecordNumber,
        BelongsDepartments,ProjectName,ProjectAddress,
        dbo.Fun_RetSanFangUnitInfoByRecordNumberAndBelongedTo(RecordNumber,'施工单位',BelongedTo) AS SGDW,
        dbo.Fun_RetSanFangUnitInfoByRecordNumberAndBelongedTo(RecordNumber,'建设单位',BelongedTo) AS JSDW, 
        dbo.Fun_RetSanFangUnitInfoByRecordNumberAndBelongedTo(RecordNumber,'监理单位',BelongedTo) AS JLDW,
        ProjectPrice,ProjectStartDateTimne,
        ProjectEndDateTimne,(CASE WHEN WhetherToStartLBS IS NULL THEN '' ELSE '' end) WhetherToStartLBS ,
        GroupName,ProjectArea,ProjectCategory,ProjectTarget,
        (CASE WHEN RemoteMonitorAccord IS NULL THEN '' ELSE '' end) RemoteMonitorAccord,
        RecordDate,(CASE WHEN FactCompletionDate IS NULL THEN '未竣工' ELSE '已竣工' end) ProjectState
         FROM dbo.ProjectOverview AS p
         LEFT JOIN V_WorkflowHandledListDistinct AS v ON  p.BelongedTo+'&'+p.RecordNumber = v.orderId
         WHERE workflowType='AnJianBeiAnSQ' AND 
         formResourceName='AnJianBeiAnSQ_003' 
         AND handleResult='通过' OR p.Remark IS NULL

 

这条语句中,加了下边函数。

ALTER function [dbo].[Fun_RetSanFangUnitInfoByRecordNumberAndBelongedTo]
(@RecordNumber varchar(50),@EnterpriseType varchar(100),@BelongedTo VARCHAR(50)
)
returns varchar(500)
as 
Begin
declare @RetUnitName varchar(500)
select @RetUnitName=EnterpriseName from ProjectEntSnapshot where RecordNumber=@RecordNumber AND BelongedTo=@BelongedTo
and EnterpriseType=@EnterpriseType and MainUnit=''
    return @RetUnitName
end

 

这条函数执行的是一个RecordNumber 对应三个单位信息。

数据展示的列表中,需要把三个单位的信息展示出来。

最初的、天空的主页 最初的、天空 | 初学一级 | 园豆:40
提问于:2015-05-07 10:04
< >
分享
最佳答案
0

不要使用函数,直接用inner join 试试。

 

推荐看一下这个:

自定义标量值函数替代“Inner join”的效率问题

收获园豆:10
爱编程的大叔 | 高人七级 |园豆:30839 | 2015-05-07 10:35

inner join 的话,我一张表中一个RecordNumber对应的是三条数据。 

最初的、天空 | 园豆:40 (初学一级) | 2015-05-07 11:00

@最初的、天空: 

1、ProjectEntSnapshot 这个表记录有多少行?

2、ProjectEntSnapshot 这个表中DUDU问的是WHERE中使用的字段是否加了索引,不加索引的速度是会慢的。

3、三条数据也是可以INNER JOIN的。

4、还有一种解决方案是在UI处理。

爱编程的大叔 | 园豆:30839 (高人七级) | 2015-05-07 11:10
其他回答(2)
0

RecordNumber与BelongedTo这2个字段建索引了吗?

dudu | 园豆:31075 (高人七级) | 2015-05-07 10:23

这个不是索引,这是两个字段。

支持(0) 反对(0) 最初的、天空 | 园豆:40 (初学一级) | 2015-05-07 10:59
0

根据你这样说,没必要用函数。函数效率是很低的。试试用子查询可能还快些。

清海扬波 | 园豆:825 (小虾三级) | 2015-05-07 16:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册