以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  sql一次性union all插入多行数据显示查询超时怎么办?  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=126734)

--  作者:happyft
--  发布时间:2018/10/27 18:49:00
--  sql一次性union all插入多行数据显示查询超时怎么办?
在一个查询表中有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
--  发布时间:2018/10/28 11:46:00
--  
后来改用SqlBulkCopy遍历前台表中各列后一次性插入5000行0.3秒实现,想问一下SqlBulkCopy有没有倒过来的方法,比如后台有30万行数据一次性快速加载到ft前台来处理?因为在SQL数据库的储存过程中用游标处理BOM表展开各层计算如果数据超过30万,总显示查询超时
--  作者:有点蓝
--  发布时间:2018/10/29 9:10:00
--  
1、使用SQLCommand查询,设置超时时间:http://www.foxtable.com/webhelp/scr/0696.htm

2、分页加载

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

--  作者:有点甜
--  发布时间:2018/10/29 11:29:00
--  

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

 

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


--  作者:HappyFt
--  发布时间: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分多钟,所以想说是否把数据先全部加载到前台再处理更快些?

--  作者:有点甜
--  发布时间:2018/10/29 14:45:00
--  
能否把数据一次性加载到foxtable里面,用foxtable代码处理好以后,显示或者再写回数据库?
--  作者:HappyFt
--  发布时间:2018/10/29 15:04:00
--  
就想这样,但是BOM展开是分层计算的,foxtable不知道要如何处理?天问那个例子应该只有一层...如果这样是否可行

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

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

--  作者:有点甜
--  发布时间:2018/10/29 15:12:00
--  

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

 

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