以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  代码执行效率  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=143317)

--  作者:kaituozhe
--  发布时间:2019/11/20 23:10:00
--  代码执行效率

以下代码执行到黄色部分,需要3.8秒,不知道是什么原因?“网络子账户明细”数据有25万行

Dim st As Date = Date.Now
If e.DataRow.Isnull("系统交易时间") = False Then
    Dim filter1 As String =" 收款子账号 = \'" & e.DataRow("付款子账号") & "\' and 发生额= \'" & e.DataRow("发生额") & "\'and 系统交易时间>= \'" & e.DataRow("系统交易时间").AddSeconds(-10) & "\'and 系统交易时间<= \'" & e.DataRow("系统交易时间") & "\' "
    Dim filter2 As String =" 付款子账号 = \'" & e.DataRow("收款子账号") & "\' and 发生额= \'" & e.DataRow("发生额") & "\'and 系统交易时间<= \'" & e.DataRow("系统交易时间").AddSeconds(10) & "\'and 系统交易时间>= \'" & e.DataRow("系统交易时间") & "\'"
    Dim filter3 As String =" 付款子账号 = \'" & e.DataRow("下手收款子账号") & "\' and 系统交易时间<= \'" & e.DataRow("系统交易时间").AddSeconds(10) & "\'and 系统交易时间>= \'" & e.DataRow("系统交易时间").AddSeconds(-10)  & "\'and 收款账户名称 <> \'" & e.DataRow("收款账户名称") & "\'"
    Dim filter4 As String =" 付款子账号 = \'" & e.DataRow("上手收款子账号") & "\' and 系统交易时间>= \'" & e.DataRow("系统交易时间").AddSeconds(-10) & "\'and 系统交易时间<= \'" & e.DataRow("系统交易时间").AddSeconds(10) & "\' and 收款账户名称 <> \'" & e.DataRow("收款账户名称") & "\'  "
    Select Case e.DataCol.name
        Case "收款账户名称"
            If DataTables.Contains("网络子账户明细") =True Then
               
                If  e.DataRow.Isnull("付款子账号") = False AndAlso  e.DataRow.Isnull("支付单号") = False AndAlso  e.DataRow.Isnull("系统交易时间") = False Then

                    Dim dr1 As DataRow = DataTables("网络子账户明细").find(filter1)

                    If dr1 IsNot Nothing Then
                        e.DataRow("上手收款账户名称") = dr1("付款账户名称")
                        e.DataRow("上手收款子账号") = dr1("付款子账号")
                        e.DataRow("下手收款账户名称") = Nothing
                        e.DataRow("下手收款子账号") = Nothing
                    Else
                        e.DataRow("上手收款账户名称") = Nothing
                        e.DataRow("上手收款子账号") = Nothing
                        e.DataRow("下手收款账户名称") = Nothing
                        e.DataRow("下手收款子账号") = Nothing
                    End If
MessageBox.Show("耗时: " & (Date.Now - st).TotalSeconds & "秒")
                ElseIf e.DataRow.Isnull("付款子账号") = False AndAlso  e.DataRow.Isnull("支付单号") = True AndAlso  e.DataRow.Isnull("系统交易时间") = False Then
                    Dim dr2 As DataRow = DataTables("网络子账户明细").find(filter2)
                    If dr2 IsNot Nothing Then
                        e.DataRow("下手收款账户名称") = dr2("收款账户名称")
                        e.DataRow("下手收款子账号") = dr2("收款子账号")
                        e.DataRow("上手收款账户名称") = Nothing
                        e.DataRow("上手收款子账号") = Nothing
                    Else
                        e.DataRow("下手收款账户名称") = Nothing
                        e.DataRow("下手收款子账号") = Nothing
                        e.DataRow("上手收款账户名称") = Nothing
                        e.DataRow("上手收款子账号") = Nothing
                    End If
                End If
            End If

           End Select
End If


--  作者:kaituozhe
--  发布时间:2019/11/20 23:36:00
--  
可能是有比较多的费等于比较,上述代码怎么修改可以避免呢?
--  作者:程兴刚
--  发布时间:2019/11/20 23:57:00
--  
1、如果"网络子账户明细" 不是生成的临时表,没必要每次判断,
2、当有一个条件不满足时,没必要find。


If DataTables.Contains("网络子账户明细")  = False
    Return Nothing
End If \'网络子账户明细非临时表去掉前三行.
Dim st As Date = Date.Now
If e.DataRow.Isnull("系统交易时间") = False Then
    Dim filter1 As String =" 收款子账号 = \'" & e.DataRow("付款子账号") & "\' and 发生额= \'" & e.DataRow("发生额") & "\'and 系统交易时间>= \'" & e.DataRow("系统交易时间").AddSeconds(-10) & "\'and 系统交易时间<= \'" & e.DataRow("系统交易时间") & "\' "
    Dim filter2 As String =" 付款子账号 = \'" & e.DataRow("收款子账号") & "\' and 发生额= \'" & e.DataRow("发生额") & "\'and 系统交易时间<= \'" & e.DataRow("系统交易时间").AddSeconds(10) & "\'and 系统交易时间>= \'" & e.DataRow("系统交易时间") & "\'"
    Dim filter3 As String =" 付款子账号 = \'" & e.DataRow("下手收款子账号") & "\' and 系统交易时间<= \'" & e.DataRow("系统交易时间").AddSeconds(10) & "\'and 系统交易时间>= \'" & e.DataRow("系统交易时间").AddSeconds(-10)  & "\'and 收款账户名称 <> \'" & e.DataRow("收款账户名称") & "\'"
    Dim filter4 As String =" 付款子账号 = \'" & e.DataRow("上手收款子账号") & "\' and 系统交易时间>= \'" & e.DataRow("系统交易时间").AddSeconds(-10) & "\'and 系统交易时间<= \'" & e.DataRow("系统交易时间").AddSeconds(10) & "\' and 收款账户名称 <> \'" & e.DataRow("收款账户名称") & "\'  "
    Select Case e.DataCol.name
        Case "收款账户名称"
            If  e.DataRow.Isnull("付款子账号") = False AndAlso  e.DataRow.Isnull("支付单号") = False AndAlso  e.DataRow.Isnull("系统交易时间") = False Then
                Dim dr1 As DataRow = DataTables("网络子账户明细").find(filter1)
                If dr1 IsNot Nothing Then
                    e.DataRow("上手收款账户名称") = dr1("付款账户名称")
                    e.DataRow("上手收款子账号") = dr1("付款子账号")
                    e.DataRow("下手收款账户名称") = Nothing
                    e.DataRow("下手收款子账号") = Nothing
                    Return Nothing
                End If
                MessageBox.Show("耗时: " & (Date.Now - st).TotalSeconds & "秒")
            ElseIf e.DataRow.Isnull("付款子账号") = False AndAlso  e.DataRow.Isnull("支付单号") = True AndAlso  e.DataRow.Isnull("系统交易时间") = False Then
                Dim dr2 As DataRow = DataTables("网络子账户明细").find(filter2)
                If dr2 IsNot Nothing Then
                    e.DataRow("下手收款账户名称") = dr2("收款账户名称")
                    e.DataRow("下手收款子账号") = dr2("收款子账号")
                    e.DataRow("上手收款账户名称") = Nothing
                    e.DataRow("上手收款子账号") = Nothing
                    Return Nothing
                End If
            Else
                e.DataRow("下手收款账户名称") = Nothing
                e.DataRow("下手收款子账号") = Nothing
                e.DataRow("上手收款账户名称") = Nothing
                e.DataRow("上手收款子账号") = Nothing
            End If
    End Select
End If
[此贴子已经被作者于2019/11/21 0:00:50编辑过]

--  作者:kaituozhe
--  发布时间:2019/11/21 0:11:00
--  
最关键的非等于比较,Dim filter1 As String =" 收款子账号 = \'" & e.DataRow("付款子账号") & "\' and 发生额= \'" & e.DataRow("发生额") & "\'  如果能够找到符合这个条件最近的 “系统交易时间”,就可以用等于,不知道该怎么写代码?
--  作者:有点蓝
--  发布时间:2019/11/21 8:56:00
--  
25W行数据?建议不要加载这么多数据,然后改为后台查询。给数据库表加上必要的索引。
--  作者:程兴刚
--  发布时间:2019/11/21 9:51:00
--  
时间的大于等于可以修改一下(没明白您的日期时间值两端的格式符号为什么是单引号而不是双引号?该有的空格也没有?这样的代码执行应该是要报错的! ):

If DataTables.Contains("网络子账户明细")  = False
    Return Nothing
End If \'网络子账户明细非临时表去掉前三行.
Dim st As Date = Date.Now
If e.DataRow.Isnull("系统交易时间") = False Then
    Dim filter1 As String ="收款子账号 = \'" & e.DataRow("付款子账号") & "\' and 发生额= \'" & e.DataRow("发生额") & "\' and 系统交易时间> #" & e.DataRow("系统交易时间").AddSeconds(-11) & "# and 系统交易时间< #" & e.DataRow("系统交易时间").AddSeconds(1)  & "#"
    Dim filter2 As String ="付款子账号 = \'" & e.DataRow("收款子账号") & "\' and 发生额= \'" & e.DataRow("发生额") & "\' and 系统交易时间< #" & e.DataRow("系统交易时间").AddSeconds(11) & "# and 系统交易时间 > " & e.DataRow("系统交易时间").AddSeconds(-1) & "#"
    Dim filter3 As String ="付款子账号 = \'" & e.DataRow("下手收款子账号") & "\' and 系统交易时间< #" & e.DataRow("系统交易时间").AddSeconds(11) & "# and 系统交易时间 > #" & e.DataRow("系统交易时间").AddSeconds(-11)  & "# and 收款账户名称 <> \'" & e.DataRow("收款账户名称") & "\'"
    Dim filter4 As String ="付款子账号 = \'" & e.DataRow("上手收款子账号") & "\' and 系统交易时间 > #" & e.DataRow("系统交易时间").AddSeconds(-11) & "# and 系统交易时间 < #" & e.DataRow("系统交易时间").AddSeconds(11) & "# and 收款账户名称 <> \'" & e.DataRow("收款账户名称") & "\'  "
    Select Case e.DataCol.name
        Case "收款账户名称"
            If  e.DataRow.Isnull("付款子账号") = False AndAlso  e.DataRow.Isnull("支付单号") = False AndAlso  e.DataRow.Isnull("系统交易时间") = False Then
                Dim dr1 As DataRow = DataTables("网络子账户明细").find(filter1)
                If dr1 IsNot Nothing Then
                    e.DataRow("上手收款账户名称") = dr1("付款账户名称")
                    e.DataRow("上手收款子账号") = dr1("付款子账号")
                    e.DataRow("下手收款账户名称") = Nothing
                    e.DataRow("下手收款子账号") = Nothing
                    Return Nothing
                End If
                MessageBox.Show("耗时: " & (Date.Now - st).TotalSeconds & "秒")
            ElseIf e.DataRow.Isnull("付款子账号") = False AndAlso  e.DataRow.Isnull("支付单号") = True AndAlso  e.DataRow.Isnull("系统交易时间") = False Then
                Dim dr2 As DataRow = DataTables("网络子账户明细").find(filter2)
                If dr2 IsNot Nothing Then
                    e.DataRow("下手收款账户名称") = dr2("收款账户名称")
                    e.DataRow("下手收款子账号") = dr2("收款子账号")
                    e.DataRow("上手收款账户名称") = Nothing
                    e.DataRow("上手收款子账号") = Nothing
                    Return Nothing
                End If
            Else
                e.DataRow("下手收款账户名称") = Nothing
                e.DataRow("下手收款子账号") = Nothing
                e.DataRow("上手收款账户名称") = Nothing
                e.DataRow("上手收款子账号") = Nothing
            End If
    End Select
End If

--  作者:kaituozhe
--  发布时间:2019/11/23 10:47:00
--  

使用上述代码跨表更新,每条数据需要4秒,想在数据库中直接更新,一直提示错误,不知道什么原因

USE hhhh
GO
UPD ATE 网络子账户明细,网络子账户分析 SET 网络子账户分析.上手收款账户名称 = 网络子账户明细.付款账户名称,网络子账户分析.上手收款子账号 = 网络子账户明细.付款子账号
WHERE 网络子账户明细.收款子账号 = 网络子账户分析.收款子账号 and 网络子账户明细.发生额 = 网络子账户分析.发生额 and 网络子账户明细.系统交易时间 <= 网络子账户分析.系统交易时间.DATEADD(ss,-10,smalldatetime)
and 网络子账户明细.系统交易时间 >= 网络子账户分析.系统交易时间.DATEADD(ss,-10,smalldatetime) and 分析.收款账户名称 = \'张磊\'


--  作者:有点蓝
--  发布时间:2019/11/23 10:52:00
--  
试试
UPDATE 网络子账户分析 SET 网络子账户分析.上手收款账户名称 = 网络子账户明细.付款账户名称,网络子账户分析.上手收款子账号 = 网络子账户明细.付款子账号 from 网络子账户明细
WHERE 网络子账户明细.收款子账号 = 网络子账户分析.收款子账号 and 网络子账户明细.发生额 = 网络子账户分析.发生额 and 网络子账户明细.系统交易时间 <= 网络子账户分析.系统交易时间.DATEADD(ss,-10,smalldatetime)
and 网络子账户明细.系统交易时间 >= 网络子账户分析.系统交易时间.DATEADD(ss,-10,smalldatetime) and 分析.收款账户名称 = \'张磊\'
--  作者:kaituozhe
--  发布时间:2019/11/23 11:10:00
--  

USE uuuuu
GO
UP DATE 网络子账户分析 SET 分析.上手收款账户名称 = 明细.付款账户名称,网络子账户分析.上手收款子账号 = 明细.付款子账号
from 网络子账户明细 AS 明细,网络子账户分析 AS 分析
WHERE 明细.收款子账号 = 分析.收款子账号 and 明细.发生额 = 分析.发生额 and 明细.系统交易时间 <= 分析.系统交易时间.DATEADD(s,-10,smalldatetime)
and 明细.系统交易时间 >= 分析.系统交易时间.DATEADD(s,-10,smalldatetime) and 分析.收款账户名称 = \'张磊\'
SE LECT * FROM 网络子账户分析 WHERE 付款账户名称 = \'张磊\'

以下是错误提示

消息 207,级别 16,状态 1,第 3 行
列名 \'s\' 无效。
消息 207,级别 16,状态 1,第 3 行
列名 \'smalldatetime\' 无效。


--  作者:有点蓝
--  发布时间:2019/11/23 11:23:00
--  
DateAdd的用法:http://www.foxtable.com/webhelp/topics/1827.htm