Foxtable(狐表)用户栏目专家坐堂 → DataTables("表A").load加载数据慢的问题


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

主题:DataTables("表A").load加载数据慢的问题

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


加好友 发短信
等级:三尾狐 帖子:758 积分:5408 威望:0 精华:0 注册:2012/10/5 21:53:00
DataTables("表A").load加载数据慢的问题  发帖心情 Post By:2022/5/31 13:57:00 [只看该作者]

通过
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
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:758 积分:5408 威望:0 精华:0 注册:2012/10/5 21:53:00
  发帖心情 Post By:2022/5/31 14:38:00 [只看该作者]

问题应该出现在_SortKey列上,通过SqlCommand新增的行,没有_SortKey值,然后大量数据的表,load的时候会重新生成并保存_SortKey空白的行,而大量数据表的load的保存就很慢,造成load加载时间很长

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


加好友 发短信
等级:超级版主 帖子:107718 积分:547917 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:758 积分:5408 威望:0 精华:0 注册:2012/10/5 21:53:00
  发帖心情 Post By: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的值

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


加好友 发短信
等级:超级版主 帖子:107718 积分:547917 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/5/31 15:06:00 [只看该作者]

这个问题已反馈

 回到顶部