在视图上,加上自定义标量值函数,执行的效率就很低下。大神们,如何去优化?
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 对应三个单位信息。
数据展示的列表中,需要把三个单位的信息展示出来。
inner join 的话,我一张表中一个RecordNumber对应的是三条数据。
@最初的、天空:
1、ProjectEntSnapshot 这个表记录有多少行?
2、ProjectEntSnapshot 这个表中DUDU问的是WHERE中使用的字段是否加了索引,不加索引的速度是会慢的。
3、三条数据也是可以INNER JOIN的。
4、还有一种解决方案是在UI处理。
RecordNumber与BelongedTo这2个字段建索引了吗?
这个不是索引,这是两个字段。
根据你这样说,没必要用函数。函数效率是很低的。试试用子查询可能还快些。