按分类统计商品总数的性能优化思考
如上图,在很多购物类商城系统中经常能看到类似的产品分类列表,今天市场部的同志们要求每个分类后要显示该类的产品总数,并且没有产品的分类不用显示。公司这个项目中的分类有近1000种(并且是无限级分类的树型结构),如果按常规统计方法,每个分类ID都去count一下(同时考虑到每个分类的下级子分类产品数),这样的处理效率肯定很低的。
想了个办法从二个层面优化:
1.数据库层面
创建一个临时表,用游标把产品总数分类事先统计好,一次性在数据库中完成,避免ASPX页面中的多次查询请求。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | -- ============================================= -- Author: <菩提树下的杨过> -- Create date: <2010-05-31> -- Description: <分类统计产品总数> -- ============================================= CREATE PROCEDURE up_ProductClassCount AS BEGIN SET NOCOUNT ON ; --select .. into 操作会创建新表,下面的语句保证了创建前先删除同名表 if ( select COUNT (*) from sys.tables where name = 'T_ProductClassCount' )>0 drop table T_ProductClassCount --把分类表中的id先插入到临时表中 SELECT F_Id as F_ClsId ,0 as F_Count INTO T_ProductClassCount FROM T_Class WHERE F_Type= 'Product' --用游标对临时表进行汇总处理 declare @clsid uniqueidentifier; declare @ count int ; --创建游标 declare _temp_cursor Cursor For Select * From T_ProductClassCount Open _temp_cursor --打开游标 Fetch next From _temp_cursor Into @clsid,@ count While(@@Fetch_Status = 0) Begin select @ count = COUNT (0) from T_Product where F_ClsId in ( select F_Id from T_Class where F_Id=@clsid or F_ParentIdStr like '%' + CONVERT (nvarchar(50),@clsid) + '%' ); update T_ProductClassCount set f_count=@ count where f_clsid=@clsid; print CONVERT (nvarchar(50),@clsid) + ',' + Convert (nvarchar(50),@ count ) --辅助调试的打印语句 Fetch next From _temp_cursor Into @clsid,@ count End Close _temp_cursor --关闭游标 Deallocate _temp_cursor --释放游标 END |
2.页面的数据缓存优化
分类列表显示时利用数据依赖缓存,如果临时表的数据没有变化,则直接从缓存中取值显示,如果上述临时表的数据有变化,则更新缓存。
3.产品在增删改时,调用一下步骤1中的存储过程,以更新临时表.
注:因为公司平台每天新增的产品数并不多,主要压力来自数据的查询,所以总体看下来这样优化的效果还是比较理想的。
作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步