Foxtable(狐表)用户栏目专家坐堂 → sql一次性union all插入多行数据显示查询超时怎么办?


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

主题:sql一次性union all插入多行数据显示查询超时怎么办?

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


加好友 发短信
等级:八尾狐 帖子:1930 积分:17576 威望:0 精华:0 注册:2014/7/29 19:09:00
sql一次性union all插入多行数据显示查询超时怎么办?  发帖心情 Post By:2018/10/27 18:49:00 [只看该作者]

在一个查询表中有5000条左右记录,用下面的语句拼接想一次性插入到sql数据库中
Dim sb As new  StringBuilder
sb.AppendLine("insert into " & sqltbn & "(" & str1.trim(",") & ")")  '大量数据先加入开始行
For Each dr As DataRow In drs  
  Dim tb As DataTable = DataTables(dr("wintbN")) 
  Dim sqltbn As String = dr("tbn")  '后台sql数据表名
       '---先获取要写入值的字段名称
        Dim str1 As String = ""
        For Each dc As DataCol In tb.dataCols
            If dc.name <> "RowNum" Then  '--排除分页加载列否则出错
                str1 + = dc.Name & ","
            End If
        Next
        str1 + = "_SortKey"   '加上排序列为最后一列,否则上下移动不能保存

   sb.AppendLine("Select " & str2.Trim(",") & vbcrlf & "Union All" )  '大量数据先加入开始行

Next
最后一次性插入到sql数据库中
 If sb.ToString > "" AndAlso flag1 = 1 Then
     Dim s As String = sb.ToString
     sqlList.Add(s.SubString(0,s.Length - 11))  '加入事务中
  End If
最后运行事务保存时等待十几秒就弹出弹出查询超时的错误,有什么方法可以改进(除了不要一次性保存这么多这个方法外)
还是如何设置sql弹出查询超时的时间(数据少时很快排除其他语法问题)

谢谢!


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


加好友 发短信
等级:八尾狐 帖子:1930 积分:17576 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2018/10/28 11:46:00 [只看该作者]

后来改用SqlBulkCopy遍历前台表中各列后一次性插入5000行0.3秒实现,想问一下SqlBulkCopy有没有倒过来的方法,比如后台有30万行数据一次性快速加载到ft前台来处理?因为在SQL数据库的储存过程中用游标处理BOM表展开各层计算如果数据超过30万,总显示查询超时

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


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

1、使用SQLCommand查询,设置超时时间:http://www.foxtable.com/webhelp/scr/0696.htm

2、分页加载

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


加好友 发短信
等级:八尾狐 帖子:1930 积分:17576 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2018/10/29 9:28:00 [只看该作者]

在调用的储存过程中设置超时就可以了,是看了一下天问在论坛中的30万数据6秒计算MRP的例子,其应该是将数据全部加载进来一次性处理,不然怎么可能?
MRP展开计算时要全部计算的数据加载进来才能计算,分页加载不行,所以想说是否有快速加载进去的方法,因为现在直接在sql数据库上用游标运行计算差不多要4分钟有点慢

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/10/29 11:29:00 [只看该作者]

1、如果加载数据慢,看看你设置索引了没有,还有查询时设置的条件是否低效。

 

2、优化存放结构、计算方式。


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


加好友 发短信
等级:八尾狐 帖子:1930 积分:17576 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2018/10/29 14:33:00 [只看该作者]

查询加载数据不慢,是本身在sql数据库上运行储存过程慢,因为BOM逐层展开目前除老师上次提供的方法外
http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=111368&authorid=0&page=0&star=1

目前还没有其他办法,现在数据量大每次计算要4分多钟,所以想说是否把数据先全部加载到前台再处理更快些?

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/10/29 14:45:00 [只看该作者]

能否把数据一次性加载到foxtable里面,用foxtable代码处理好以后,显示或者再写回数据库?

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


加好友 发短信
等级:八尾狐 帖子:1930 积分:17576 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2018/10/29 15:04:00 [只看该作者]

就想这样,但是BOM展开是分层计算的,foxtable不知道要如何处理?天问那个例子应该只有一层...如果这样是否可行

图片点击可在新窗口打开查看此主题相关图片如下:bom.jpg
图片点击可在新窗口打开查看

BOM计算的原始需求输入不到4万行数据,但层次有5层,BOM展开计算是从0层计算扣除库存,在线等得到最终需求数量再根据BOM表计算出第一层需求;
然后用SqlBulkCopyu快速写入到sql数据库中,foxtable再加载第一层的数据进来再处理得到第二层这样一直到最后一层?
最后把各层计算的最后结果合在一起加载进来?

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/10/29 15:12:00 [只看该作者]

1、你清楚你的计算逻辑了没有?把所需要的数据都加载出来,在foxtable里面处理,得到结果。

 

2、还是不理解你要做什么。尽量结合例子发上来测试,说明你要做到的效果。代码的优化,尽量减少不必要的查询。


 回到顶部