Foxtable(狐表)用户栏目专家坐堂 → [求助]多线程的问题


  共有5538人关注过本帖树形打印复制链接

主题:[求助]多线程的问题

帅哥哟,离线,有人找我吗?
有点蓝
  21楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106209 积分:540168 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/2/20 23:25:00 [只看该作者]

TbGoods表显示为一片空白,原因:http://www.foxtable.com/webhelp/scr/1906.htm

这个貌似也就是是一些既有数据的汇总而已,没看到需要做什么二次加工,没有必要什么多线程吧。直接一条sql语句就行了

Select a.id,a.code,b.AlterA  As TotalAlterA  from TbGoods As a  
    left join (Select GoodsID,sum(AlterA) As AlterA 
        from TbAlter where [Date] >= #2018-02-01# And [Date] < #2018-03-01# group by GoodsID ) As b 
    on a.ID= b.GoodsID

TbRK表没有数据,也没有看到有日期列,所以没有处理,自己参考上面TbAlter 的方式做即可,如

Select a.id,a.code,b.AlterA  As TotalAlterA,c.CurA   from TbGoods As a  
    left join (Select GoodsID,sum(AlterA) As AlterA 
        from TbAlter where [Date] >= #2018-02-01# And [Date] < #2018-03-01# group by GoodsID ) As b 
    on a.ID= b.GoodsID
    left join (Select GoodsID,sum(A) As CurA 
        from TbRK where [Date] >= #2018-02-01# And [Date] < #2018-03-01# group by GoodsID  ) As c 
    on a.ID= c.GoodsID

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  22楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2193 积分:18033 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2019/2/21 18:52:00 [只看该作者]

怕什么果然就是什么。
实际的系统是一个比较大的系统,远不是示例上的三个表。而且表列也远不上示例上的那么简单几列。
最开始是用的ACCESS数据库。
然后做法也直接采用SQL执行的(跟上面蓝版主说的方法大同小异),界面也不是单纯的一个表,还有树形结构、还有递归计算等。
但执行之后发现耗时需要约14秒,这个速度显然是不能让人满意的。
然后改换了SQL2005,效率有所提升,但仍然需要10秒钟。

经过实际测试,发现一个问题。比如界面上要计算的是5列(上传的示例是2列,它们的计算来源于5个相互独立的数据库表),如果逐一执行的话,每个都需要1.5秒钟,那就得要7.5秒。
所以,我在想,如果开启5个线程同时来计算这5列的值,会不会减少6秒的计算时间呢?

而我又不能把整个系统搬到示例中来,所以举了一个简单的例子传上来,希望获取一个方法,用这个多线程的方法来检验系统的执行时间是否会减少

以上传的例子来说的话,导致执行时间长的原因可能是两个
1、商品目录行数太多(实际系统有些业务达到4-10万行的数据量)
2、要计算的列多了一点(示例是2列,但目前实际系统计算的值,其中一项业务是8列)
[此贴子已经被作者于2019/2/21 19:00:08编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  23楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106209 积分:540168 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/2/21 20:49:00 [只看该作者]

我感觉这不是单纯的线程不线程的问题,而是一种业务模式的优化。不过可能帮不了您,需要非常熟悉表结构,以及整个流程和业务逻辑才行。

提几个建议:
1、表结构和数据录入还有没有可以优化余地?或者能不能添加一些辅助表,保存一些不需要重复计算的统计结果,然后每天把这些结果计算并保存起来
2、使用线程的目的无非就是把数据进行分批计算,属于怎么分
    横向可以按商品条数进行分,比如一个线程计算1000个商品的数据
    纵向可以按属性进行分,也就是上面说的按列,因为每列的数据来自一个表,那么可以5列开5个线程,可以先把这些表指定时间段内的所有商品的数据都汇总出来保存到临时表中,最后像21楼那样,一条SQL关联把这些数据都提取出来即可

3、有时候,一个计算不一定单纯在前端使用代码处理,或者单纯在数据库使用sql处理。可以结合起来,多种方式结合,取最优的组合。

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  24楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2193 积分:18033 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2019/2/21 22:35:00 [只看该作者]

纵向可以按属性进行分,也就是上面说的按列,因为每列的数据来自一个表,那么可以5列开5个线程,可以先把这些表指定时间段内的所有商品的数据都汇总出来保存到临时表中,最后像21楼那样,一条SQL关联把这些数据都提取出来即可

----保存到临时表。但前面提到多线程对操作表的支持性不太好,那该如何处理呢?
如果设计一个临时表,把商品目录filler进来,这个不是问题。
但怎么保存分别计算出来的这5列数据?

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  25楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106209 积分:540168 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/2/21 22:39:00 [只看该作者]

我说的临时表是指数据库的表,不是Foxtable的表,在数据库中预先建立好存储这些计算结果的表,在线程中计算后把数据存储到数据库的临时表中。

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  26楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2193 积分:18033 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2019/2/21 22:44:00 [只看该作者]

执行过程中建一个临时表可不可以?
因为如果在数据库中建表,A店的人在操作,B店的人也在操作,这个临时表可能会有问题

啊哦,不行,SQL不支持临时表的操作
[此贴子已经被作者于2019/2/21 22:47:48编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  27楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106209 积分:540168 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/2/21 22:51:00 [只看该作者]

临时表加上一列【店名】区分自己的数据不就行了。

或者每个店都建立自己的临时表咯。大型项目为了方便计算,建立几百个临时表是家常便饭
[此贴子已经被作者于2019/2/21 22:52:50编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  28楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2193 积分:18033 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2019/2/21 22:59:00 [只看该作者]

这样做可能还是会有问题。
因为tbRK的操作可能不是一个人。如果某一个店有多个人在操作,张三正在查看3月份的数据,李四想查看4月份的数据,而王五想填写5月份的数据。
如果临时表中的字段包括店名、商品ID、已调整数量、已入库数量,那么就不能同时满足三个人看数据的要求。
除非临时表中的字段再增加一列月份。

但这样设计,就有个弊端,并非每种商品每个月都有调整、或每个月都有入库,这个数据复制的行数就很多,而且似乎并无太大意义。

[此贴子已经被作者于2019/2/21 23:01:09编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  29楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106209 积分:540168 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/2/21 23:23:00 [只看该作者]

既然是临时表,数据当然是需要的时候才生成。生成之前可以把旧数据删除掉咯。至于临时表有什么列,根据自己的需要设计。

就算是10W个商品,这个月都有调整,全部都要计算,也就存储10W条记录而已,100家店也就1000W条记录,如果索引建立合理,从几个1000W条记录的表里进行关联查询获取每个表10W条记录,也就1秒的事。主要的瓶颈在于生成统计结果的这个过程,就是上面所说的树形结构、还有递归计算等等,至于结果的存储和查询基本不是问题。

上面说的,全部使用sql计算,需要10秒,那么如果把这些sql,分成几部分,比如每个表的计算的sql单独出来,由线程来调用,这样就可以同时计算,会不会快呢

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  30楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2193 积分:18033 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2019/2/21 23:27:00 [只看该作者]

不是这个意思,我是说同一家店,张三在看3月的数据,李四看4月的,王五在看5月的,三个人同时看,不就麻烦了?因为每个月的已入库数量是不同的嘛。截止3月的已入库明细和数量、截止4月的、截止5月的,都不尽相同啊

因为要查看3月的数据,要显示截止3月的调整总量、已入库量、本月入库量,而不是仅仅看3月入库量这一列。

所以,最后还是回到你说的那条老路子上,每个月把所有目录的最新调整后、已入库量、本月入库量存一遍。
[此贴子已经被作者于2019/2/21 23:37:46编辑过]

 回到顶部
总数 59 上一页 1 2 3 4 5 6 下一页