以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- DataTables("表A").load加载数据慢的问题 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=177700) |
-- 作者:z769036165 -- 发布时间:2022/5/31 13:57:00 -- DataTables("表A").load加载数据慢的问题 通过 Dim pd As
DataTable
\'订单表 Dim od As DataTable \'订单明细表 Dim cmd As New SqlCommand() cmd.ConnectionName = "Orders" Try cmd.BeginTransaction() cmd.CommandText = "Select * F rom Orders Where OrderID = 10259" pd = cmd.ExecuteReader(True) \'加上参数True,生成的DataTable可修改保存 cmd.CommandText = "Select * F rom OrderDetails Where OrderID = 10259" od = cmd.ExecuteReader(True) If pd.DataRows.Count > 0 Then pd.DataRows(0)("OrderDate") = Date.Today End If For Each dr As DataRow In od.DataRows If dr("Quantity") > 50 Then dr("Discount") = 0.2 Else dr("Discount") = 0.1 End If Next pd.Save() od.Save() If pd.HasChanges OrElse od.HasChanges Then \'如果任何一个表保存失败 cmd.Rollback() \'则回滚事务 Else cmd.Commit() \'否则提交事务 End If Catch ex As Exception \'如果出错 cmd.Rollback() \'则回滚事务 MessageBox.Show(ex.Message, "错误",MessageBoxButtons.OK,MessageBoxIcon.Error) End Try 这样保存数据之后,然后对应的表,进行 DataTables("订单明细表").LoadFilter = "OrderID = \'10259\'" DataTables("订单明细表").Load 发现load时间需要很长,我这实际明细表有300多万行,新增行后,重新load这个单号的明细需要30秒,请问这个是哪方面的问题? 而且是通过上面SqlCommand处理后第一次load需要这样,后面load加载正常,速度很快 [此贴子已经被作者于2022/5/31 13:58:29编辑过]
|
-- 作者:z769036165 -- 发布时间:2022/5/31 14:38:00 -- 问题应该出现在_SortKey列上,通过SqlCommand新增的行,没有_SortKey值,然后大量数据的表,load的时候会重新生成并保存_SortKey空白的行,而大量数据表的load的保存就很慢,造成load加载时间很长 |
-- 作者:有点蓝 -- 发布时间:2022/5/31 14:40:00 -- 确定是这个加载的耗时? Dim st As Date = Date.Now \'将开始时间保存在变量st DataTables("订单明细表").StopRedraw() DataTables("订单明细表").LoadFilter = "OrderID = \'10259\'" DataTables("订单明细表").Load DataTables("订单明细表").ResumeRedraw()MessageBox.Show("耗时: " & (Date.Now - st).TotalSeconds & "秒") \'计算并显示执行代码所花费的秒数 到数据库给OrderID 加上索引
|
-- 作者:z769036165 -- 发布时间:2022/5/31 14:48:00 -- 大量数据表的索引早就加好了,通过在这样 od = cmd.ExecuteReader(True) od.save For Each dr As DataRow In os.DataRows dr.baserow("_SortKey") = dr("_Identify") Next od.save 这样多了红色部分这个操作后,就正常了,速度飞快 Dim cmd As New SQLCommand cmd.C cmd.CommandText = "SELECT * F ROM [明细明细表] WHERE 1=2" Dim dt As DataTable = cmd.ExecuteReader(True) dt.AddNew 建议通过SQLCommand增加的行保存时,同时将_SortKey的值填充为_Identify的值
|
-- 作者:有点蓝 -- 发布时间:2022/5/31 15:06:00 -- 这个问题已反馈 |