以文本方式查看主题 - 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计算的原始需求输入不到4万行数据,但层次有5层,BOM展开计算是从0层计算扣除库存,在线等得到最终需求数量再根据BOM表计算出第一层需求; 然后用SqlBulkCopyu快速写入到sql数据库中,foxtable再加载第一层的数据进来再处理得到第二层这样一直到最后一层? 最后把各层计算的最后结果合在一起加载进来?
|
-- 作者:有点甜 -- 发布时间:2018/10/29 15:12:00 -- 1、你清楚你的计算逻辑了没有?把所需要的数据都加载出来,在foxtable里面处理,得到结果。
2、还是不理解你要做什么。尽量结合例子发上来测试,说明你要做到的效果。代码的优化,尽量减少不必要的查询。 |