zoukankan      html  css  js  c++  java
  • 按分类统计商品总数的性能优化思考

    如上图,在很多购物类商城系统中经常能看到类似的产品分类列表,今天市场部的同志们要求每个分类后要显示该类的产品总数,并且没有产品的分类不用显示。公司这个项目中的分类有近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中的存储过程,以更新临时表.

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

    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    java编译错误No enclosing instance of type TestFrame is accessible. Must qualify the allocation with an enclosing instance of type TestFrame (e.g. x.new A(
    java 2中创建线程方法
    动态规划基本思想
    关于eclipse编译一个工程多个main函数
    java Gui初识
    Eclipse中java项目的打包
    java 播放声音
    把资源文件夹导入到eclipse中
    Java建立JProgressBar
    How to grant permissions to a custom assembly that is referenced in a report in Reporting Services
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/1748482.html
Copyright © 2011-2022 走看看