以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  DataTables("表A").load加载数据慢的问题  (http://foxtable.com/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
--  
这个问题已反馈