最近遇到一个需求,要求在会员卡表增加几个冗余字段,记录该会员卡的最后消费时间,总消费金额(总消费金额分为现金,会员卡卡金,其中现金包括支付宝,微信和其他用户自定义支付方式),总消费次数,总充值金额,最后充值时间,总充值次数这么几个冗余字段。目前分离出来的测试数据库里面正常会员卡的总数是700万左右,消费数据上亿了(暂且就考虑为一亿);
涉及到的数据表:
MemberShipCards:会员卡表(700多万条正常数据)
MemberConsums:消费记录表
MemberConsumePayments:消费记录支付方式
MemberPayment:支付方式列表
MemberRecharges:充值数据
各个表之间的关联关系是:MemberConsumes关联了MemberShipCards(一张会员卡有多条消费记录)
MemberConsumePayments:这里面记录了该会员卡结算的使用的结算方式,关联在每条消费记录上面的(MemberConsums),但是每一种结算方式又是对应在MemberPayment支付方式列表里面的,也就是说要查询每张卡的现金支付总金额就要MemberShipCards,MemberConsums,MemberConsumePayments,MemberPayment联合查询,比如:
select sum(money) from MemberConsumePayments p inner join MemberConsums c
on p.ConsumeId=c.Id
inner join MemberPayment m on p.PaymentId=m.Id where c.status=1 and m.paymenttype in(1,3,4,6,8) and c.memberCardid=xxxx
以上的sql语句就是查询该会员卡总现金消费金额(支付金额是存储在MemberConsumePayments 这里面的,而区别现金这个支付方式的在MemberPayment这里面,因为每张卡有很多的消费记录,要筛选出正常状态的,所以才有c.status=1 )
然后查询出这个金额之后再根据会员卡id去修改会员表里面的冗余字段值
以上就是其中的一个查询,目前我的实现逻辑是先把正常的会员卡id查询出来放在临时表里面,然后循环这个临时表
select id=identity(int,1,1),Id as cardId into #cardsIds from MemberShipCards where [Status] = 1
CREATE INDEX IX_Id ON #cardsIds(Id)
declare @count bigint
declare @index bigint
select @count = COUNT(id) from #cardsIds
while(@count>=@index)
begin
--具体逻辑,查询和修改冗余字段
set @index+=1
end
注:各个查询总和的字段和where条件都已建立索引,由于这里我用的是存储过程循环600多万条数据,整个过程执行完毕粗略估算大约耗时好几个小时,这样对于其他的查询操作肯定受影响,由于本人sql功底有限,在此跪求各位大神为小弟提供一下解决方案,大恩不言谢
湖上湖
素胚勾勒不出你
子衿沉夜
慕虎7371278
守候你守候我
qq_笑_17
BIG阳
潇湘沐
江户川乱折腾
繁花如伊
相关分类