按分类统计商品总数的性能优化思考

如上图,在很多购物类商城系统中经常能看到类似的产品分类列表,今天市场部的同志们要求每个分类后要显示该类的产品总数,并且没有产品的分类不用显示。公司这个项目中的分类有近1000种(并且是无限级分类的树型结构),如果按常规统计方法,每个分类ID都去count一下(同时考虑到每个分类的下级子分类产品数),这样的处理效率肯定很低的。

 

想了个办法从二个层面优化:

1.数据库层面

创建一个临时表,用游标把产品总数分类事先统计好,一次性在数据库中完成,避免ASPX页面中的多次查询请求。

-- =============================================
-- 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中的存储过程,以更新临时表.

 

注:因为公司平台每天新增的产品数并不多,主要压力来自数据的查询,所以总体看下来这样优化的效果还是比较理想的。

时间: 2024-08-19 07:42:44

按分类统计商品总数的性能优化思考的相关文章

关于 Swift 编译时性能优化的一些思考

本文讲的是关于 Swift 编译时性能优化的一些思考, 上周,我读了 @nickoneill 一篇优秀的帖子 Speeding Up Slow Swift Build Times 之后,我发现用一个略不同以往的角度去读Swift代码,并不是很难. 一行之前很简洁的代码,现在却出现了新的问题--它是否应该重构为9行代码来达到更快的编译速度? (nil coalescing 运算符就是一个例子)孰轻孰重?简洁的代码还是对编译器友好的代码? 我觉得,它取决于项目的大小和开发者的想法. 但请等等...

蚂蚁金服技术专家对性能优化的常见模式及趋势的思考

发表自<中生代>微信公众号.作者是陈显铭,从事研发工作七年,蚂蚁金服技术专家.对于性能优化的思考,很有价值,分享给大家. 从上图可以看出几个优点 成本降低 稳定性提升 用户体验体验提升 性能优化的缺点也有 维护成本增加:代码可能变复杂,结构可能变复杂,技术栈可能变复杂 性能优化的两种模式 个人总结,性能优化整体上可以分为两类:单应用优化和结构型优化. 单应用优化,关注单系统瓶颈,通过解决单系统瓶颈提升性能. 结构型优化,通过改造链路结构和配比,进行整体性能的优化. 单应用优化常见步骤 优化基本

ASP.NET性能优化小结(ASP.NET&amp;amp;C#)

ASP.NET: 一.返回多个数据集 检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够响应请求的次数.通过在单个数据库请求中返回多个结果集,可以减少与数据库通信的时间,使你的系统具有扩展性,也可以减少数据库服务器响应请求的工作量. 如果用动态的SQL语句来返回多个数据集,那用存储过程来替代动态的SQL语句会更好些.是否把业务逻辑写到存储过程中,这个有点争议.但是我认为,把业务逻辑写到存储过程里面可以限制返回结果集的大小,减小网络数据的流量,在逻辑层也不

Hive性能优化

1.概述 继续<那些年使用Hive踩过的坑>一文中的剩余部分,本篇博客赘述了在工作中总结Hive的常用优化手段和在工作中使用Hive出现的问题.下面开始本篇文章的优化介绍. 2.介绍 首先,我们来看看Hadoop的计算框架特性,在此特性下会衍生哪些问题? 数据量大不是问题,数据倾斜是个问题. jobs数比较多的作业运行效率相对比较低,比如即使有几百行的表,如果多次关联多次汇总,产生十几个jobs,耗时很长.原因是map reduce作业初始化的时间是比较长的. sum,count,max,mi

手淘双十一系列(一) | 521 性能优化项目揭秘

该文章来自阿里巴巴技术协会(ATA)精选集  亿万用户都会在双十一这一天打开手机淘宝,高兴地在会场页面不断浏览,面对琳琅满目的商品图片,抢着添加购物车,下单付款.为了让用户更顺畅更方便地实现这一切,做到"如丝般顺滑",双十一前夕手机淘宝成立了"521"(我爱你)性能优化项目,在日常优化基础之上进行三个方面的专项优化攻关,分别是: 1)H5页面的一秒法则: 2)启动时间和页面帧率提升20%: 3)Android内存占用降低50%. 优化过程中遇到的困难,思考后找寻的方

陈皓:由12306.cn引发的网站性能技术思考

中介交易 SEO诊断 淘宝客 云主机 技术大厅 伴随着十一长假的来临,大家对于铁道部12306的讨论又多了起来.这篇文章(原文)从12306网站延展到网站性能的诸多讨论,对于创业者与技术爱好者有很强的借鉴意义.本文作者陈皓(weibo)有14年软件开发相关工作经验,8年以上项目和团队管理经验. 12306.cn网站挂了,被全国人民骂了.我这两天也在思考这个事,我想以这个事来粗略地和大家讨论一下网站性能的问题.因为仓促,而且完全基于本人有限的经验和了解.只讨论性能问题,不讨论那些UI,用户体验,或

ASP.NET性能优化小结(ASP.NET&amp;amp;C#)_实用技巧

ASP.NET: 一.返回多个数据集 检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够响应请求的次数.通过在单个数据库请求中返回多个结果集,可以减少与数据库通信的时间,使你的系统具有扩展性,也可以减少数据库服务器响应请求的工作量. 如果用动态的SQL语句来返回多个数据集,那用存储过程来替代动态的SQL语句会更好些.是否把业务逻辑写到存储过程中,这个有点争议.但是我认为,把业务逻辑写到存储过程里面可以限制返回结果集的大小,减小网络数据的流量,在逻辑层也不

丰趣海淘:跨境电商平台的前端性能优化实践

原文出自[听云技术博客]:http://blog.tingyun.com/web/article/detail/586 随着互联网的发展,尤其是在2000年之后浏览器技术渐渐成熟,Web产品也越来越丰富,这时我们被浏览器窗口内的丰富"内容"所吸引,关注HTML/CSS,深入研究Dom.Bom和浏览器的渲染机制等,接触JavaScript库,"前端"这个职业,由此而生. 前端技术在这10多年中飞速发展,到了今天,我们可能发现"内容"的美在视觉上是有

性能优化总结(六):预加载、聚合SQL应用实例

   前面已经把原理都讲了一遍,这篇主要是给出一个应用的实例.该实例取自GIX4,比较复杂. 领域模型:     领域模型间的关系,如下: 右边模型链的具体关系在<第二篇>中已经描述过,不再赘述. 本次重点在于红线框住部分: Project:表示一个建设项目: ProjectPBS:一个项目下包含的很多PBS: PBSPropertyValue:一个PBS我们可以为它设置多个值,每一个值对应一个PBSType(模板)中已定义的属性,值的范围也是只能在属性中已定义的可选值中进行选择. 对应的UI