MSSQL的一个一对多查询的效率问题

ddlucky 2015-09-09 12:02:21
是财务类的问题,费用都写入Ch_fee表,使用随机数GID主键。

一个费用的提交收付申请、结算动作 都是写入ch_fee_do里面的,里面包含有动作代码CATEGORY和Ch_fee.GID,
一个申请或一个结算内涉及的多条费用都会有一个相同的申请单号或者结算单号 这个单号都是BILLNO

每次费用结算都是存储于 ch_fee_settlement 表内,里面有结算单号BILLNO,还有生成凭证时的凭证号VOUNO

所以一个费用如果想知道自己的凭证号,就需要根据自己的Ch_fee.GID去找ch_fee_do里面GID相同而且CATEGORY in(1,2,8,9) 的行,再通过ch_fee_do.BILLNO去找费用结算ch_fee_settlement里面BILLNO相同的行,再看它的VOUNO

于是就有了下面这个function
create function [dbo].[F_VOUNO](@gid varchar(50))
returns nvarchar(200)
as
begin
declare @S nvarchar(200)
select @S=case isnull(@S,'') when '' then (select s.VOUNO from ch_fee_settlement s where s.BILLNO=d.billno )
else ISNULL(@S,'')+','+ (select VOUNO from ch_fee_settlement where BILLNO=d.billno) end
from ch_fee_do d where d.feeid=@gid and d.CATEGORY in(1,2,8,9)
return @S
end
GO
本意是打算在费用全列表里直接带出凭证号,然而这个函数的速度很慢,如果查询4400条费用的凭证号需要大约26秒……

于是想求问一下有没有更好的解决思路

或者如果加索引可以更快的话,要怎么加索引

谢谢……
...全文
186 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ny-6000 2015-09-09
  • 打赏
  • 举报
回复
引用 2 楼 ddlucky 的回复:
好吧事实证明我又SB了,在两个表的BILLNO上加个非聚集不唯一的索引,从26秒变成1秒了……
子查询的where条件,就用了这个,加了肯定会快多
ddlucky 2015-09-09
  • 打赏
  • 举报
回复
好吧事实证明我又SB了,在两个表的BILLNO上加个非聚集不唯一的索引,从26秒变成1秒了……
ddlucky 2015-09-09
  • 打赏
  • 举报
回复
alter view vw_fee_vouno as select d.feeid,s.VOUNO from ch_fee_do D left join ch_fee_settlement s on s.BILLNO=d.BILLNO where d.CATEGORY in(1,2,8,9) --select * from vw_fee_vouno alter function [dbo].[F_VOUNO](@gid varchar(50)) returns nvarchar(200) as begin declare @S nvarchar(200) select @S=isnull(@S,'')+VOUNO+' ' from vw_fee_vouno where feeid=@gid return @S end GO 用这种方法速度反而更慢了,超过40秒……

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧