【问题标题】:Code Efficiency: Iterations and Queries代码效率:迭代和查询
【发布时间】:2014-01-17 19:22:56
【问题描述】:

下面的代码做了一些事情:

  • 遍历我的 Windows 窗体上的标签集合,用作占位符

  • 在遍历集合时,代码连接到 SQL 数据库以返回查询每个标签(大约 104 个标签)的结果

  • 最后填充了一些图表。

我已经对整个过程进行了计时,大约需要 4 或 5 秒。我的目标是立即或 1 秒或更短时间执行此过程。

那里的专家可以向我解释我做错了什么以及为什么这个过程需要这么长时间吗?

这里是查询:

Dim RESULT1 As Decimal 'declare this as global

Dim RESULT2 As Decimal 'declare this as global

Private Sub Week(ByVal week As Integer)

    Dim queryString As String = "SELECT " & _
    " (SELECT CAST(SUM(TARGET_SECONDS) AS DECIMAL)/ CAST(SUM(ROUTE_SECONDS) AS DECIMAL) FROM dbo.APE_BUSDRIVER_MAIN WITH(NOLOCK) WHERE ACTIVE = 1 AND EMPLOYEE_NAME = '" &  cbEmployeeName.Text & "') AS RESULT1," & _
    " (SELECT (SELECT CAST(COUNT(APE_BUSDRIVER_STATUS_OBJID) AS DECIMAL) FROM dbo.APE_BUSDRIVER_MAIN AS RESULT2 WHERE ACTIVE = 1 AND APE_BUSDRIVER_STATUS_OBJID= 1 AND EMPLOYEE_NAME = '" & cbEmployeeName.Text & "' )/(SELECT CAST(COUNT(APE_BUSDRIVER_STATUS_OBJID) AS DECIMAL) FROM dbo.APE_BUSDRIVER_MAIN AS RESULT2 WHERE ACTIVE = 1 AND EMPLOYEE_NAME = '" & cbEmployeeName.Text & "' )) AS RESULT2" & _
    " FROM dbo.APE_BUSDRIVER_MAIN WHERE WEEK_TIME = " & week & " AND APE_AREA_OBJID = " & lblAreaOBJID.Text & " AND EMPLOYEE_NAME = '" & cbEmployeeName.Text & "' AND YEAR_TIME = '" & cbYear.Text & "' AND ACTIVE = 1"


    Using connection As New SqlConnection(SQLConnectionStr)
        Dim command As New SqlCommand(queryString, connection)
        connection.Open()

        Dim reader As SqlDataReader = command.ExecuteReader()

        ' Call Read before accessing data. 
        If reader.HasRows Then
            While reader.Read()
                RESULT1 = reader("RESULT1")
                RESULT2 = reader("RESULT2")
            End While
        Else
            RESULT1 = 0
            RESULT2 = 0
        End If
        ' Call Close when done reading.
        reader.Close()
    End Using
End Sub

代码如下:

Private Sub LoadWeeklyStats()

    For i As Integer = 0 To 51
        Dim LabelWkEff As String = "LblWkEff" + (i + 1).ToString
        Dim myArray1 As Array = Controls.Find(LabelWkEff, False)
        Dim myControl1 As Label = myArray1(0)
        myControl1.Text = RESULT1
        'AND
        Dim LabelDeliveryStat As String = "lblDeliveryStat" + (i + 1).ToString
        Dim myArray2 As Array = Controls.Find(LabelDeliveryStat, False)
        Dim myControl2 As Label = myArray2(0)
        myControl2.Text = RESULT2
        'COUNTER
        Week(i + 1)
    Next

    'TO CLEAR CHART AND RELOAD IT
    Chart1.Titles.Clear()
    Chart1.Series.Clear()
    Chart1.ChartAreas.Clear()
    Chart1.ChartAreas.Add("AREA")
    Chart1.Series.Add("WeeklyEfficiency")
    Chart1.Series.Add("TARGET")
    Chart1.Titles.Add("ROUTE EFFICIENCY")
    Chart1.Series("TARGET").ChartType = SeriesChartType.Line

    With Chart1.Titles(0)
        .Font = New Font("TAHOMA", 12, FontStyle.Bold)
    End With

    With Chart1.ChartAreas(0)
        '.AxisY.MajorGrid.Enabled = False
        .AxisX.MajorGrid.Enabled = False
        .AxisX.Title = "WEEKS"
        .AxisY.Title = "EFFICIENCY"
        .AxisX.Minimum = 0
        .AxisX.Maximum = 53
        .AxisY.Minimum = 0
        .AxisX.Interval = 1
        .AxisY.LabelStyle.Format = Format(0, "0%")
   End With

   With Chart1.Series(0)
        .Font = New Font(Me.Font.Name, 7, FontStyle.Regular)
        .SmartLabelStyle.Enabled = False
        .LabelAngle = -90
        .Label = "#VAL{P}"
        .IsValueShownAsLabel = True
        .Name = "WeeklyEfficiency"
        .ChartType = SeriesChartType.Column
        .LabelToolTip = Enabled
        .ToolTip = "WEEK #VALX" & vbNewLine & "#VAL{P}"
        .BorderColor = Color.Black
        .LabelForeColor = Color.Transparent
        Dim area As String = cbArea.Text
        Select Case area
            Case "BC_PICKUP"
                .Color = Color.Blue
            Case "BC_DELIVERY"
                .Color = Color.Blue
            Case "RAW"
                .Color = Color.LimeGreen
            Case "RTV"
                .Color = Color.Yellow
           Case Else
                .Color = Color.Black
        End Select
        'LOAD DATA POINTS
        With .Points
            .AddXY(0, 0)
            .AddXY(1, LblWkEff1.Text)
            .AddXY(2, LblWkEff2.Text)
            .AddXY(3, LblWkEff3.Text)
            .AddXY(4, LblWkEff4.Text)
            .AddXY(5, LblWkEff5.Text)
            .AddXY(6, LblWkEff6.Text)
            .AddXY(7, LblWkEff7.Text)
            .AddXY(8, LblWkEff8.Text)
            .AddXY(9, LblWkEff9.Text)
            .AddXY(10, LblWkEff10.Text)
            .AddXY(11, LblWkEff11.Text)
            .AddXY(12, LblWkEff12.Text)
            .AddXY(13, LblWkEff13.Text)
            .AddXY(14, LblWkEff14.Text)
            .AddXY(15, LblWkEff15.Text)
            .AddXY(16, LblWkEff16.Text)
            .AddXY(17, LblWkEff17.Text)
            .AddXY(18, LblWkEff18.Text)
            .AddXY(19, LblWkEff19.Text)
            .AddXY(20, LblWkEff20.Text)
            .AddXY(21, LblWkEff21.Text)
            .AddXY(22, LblWkEff22.Text)
            .AddXY(23, LblWkEff23.Text)
            .AddXY(24, LblWkEff24.Text)
            .AddXY(25, LblWkEff25.Text)
            .AddXY(26, LblWkEff26.Text)
            .AddXY(27, LblWkEff27.Text)
            .AddXY(28, LblWkEff28.Text)
            .AddXY(29, LblWkEff29.Text)
            .AddXY(30, LblWkEff30.Text)
            .AddXY(31, LblWkEff33.Text)
            .AddXY(32, LblWkEff32.Text)
            .AddXY(33, LblWkEff33.Text)
            .AddXY(34, LblWkEff34.Text)
            .AddXY(35, LblWkEff35.Text)
            .AddXY(36, LblWkEff36.Text)
            .AddXY(37, LblWkEff37.Text)
            .AddXY(38, LblWkEff38.Text)
            .AddXY(39, LblWkEff39.Text)
            .AddXY(40, LblWkEff40.Text)
            .AddXY(41, LblWkEff41.Text)
            .AddXY(42, LblWkEff42.Text)
            .AddXY(43, LblWkEff43.Text)
            .AddXY(44, LblWkEff44.Text)
            .AddXY(45, LblWkEff45.Text)
            .AddXY(46, LblWkEff46.Text)
            .AddXY(47, LblWkEff47.Text)
            .AddXY(48, LblWkEff48.Text)
            .AddXY(49, LblWkEff49.Text)
            .AddXY(50, LblWkEff50.Text)
            .AddXY(51, LblWkEff51.Text)
            .AddXY(52, LblWkEff52.Text)
            .AddXY(53, 0)
        End With
    End With

    With Chart1.Series("TARGET")
        .Name = "TARGET"
        .ChartType = SeriesChartType.Line
        .Color = Color.Red
        .BorderWidth = 3
        With .Points
            .AddXY(0, 1)
            .AddXY(1, 1)
            .AddXY(2, 1)
            .AddXY(3, 1)
            .AddXY(4, 1)
            .AddXY(5, 1)
            .AddXY(6, 1)
            .AddXY(7, 1)
            .AddXY(8, 1)
            .AddXY(9, 1)
            .AddXY(10, 1)
            .AddXY(11, 1)
            .AddXY(12, 1)
            .AddXY(13, 1)
            .AddXY(14, 1)
            .AddXY(15, 1)
            .AddXY(16, 1)
            .AddXY(17, 1)
            .AddXY(18, 1)
            .AddXY(19, 1)
            .AddXY(20, 1)
            .AddXY(21, 1)
            .AddXY(22, 1)
            .AddXY(23, 1)
            .AddXY(24, 1)
            .AddXY(25, 1)
            .AddXY(26, 1)
            .AddXY(27, 1)
            .AddXY(28, 1)
            .AddXY(29, 1)
            .AddXY(30, 1)
            .AddXY(31, 1)
            .AddXY(32, 1)
            .AddXY(33, 1)
            .AddXY(34, 1)
            .AddXY(35, 1)
            .AddXY(36, 1)
            .AddXY(37, 1)
            .AddXY(38, 1)
            .AddXY(39, 1)
            .AddXY(40, 1)
            .AddXY(41, 1)
            .AddXY(42, 1)
            .AddXY(43, 1)
            .AddXY(44, 1)
            .AddXY(45, 1)
            .AddXY(46, 1)
            .AddXY(47, 1)
            .AddXY(48, 1)
            .AddXY(49, 1)
            .AddXY(50, 1)
            .AddXY(51, 1)
            .AddXY(52, 1)
            .AddXY(53, 1)
        End With
    End With

    'MAKE ONTIME CHART
    '______________________________________________________________________________()
    'TO CLEAR CHART AND RELOAD IT
    Chart2.Titles.Clear()
    Chart2.Series.Clear()
    Chart2.ChartAreas.Clear()
    Chart2.ChartAreas.Add("AREA")
    Chart2.Series.Add("WeeklyEfficiency")
    Chart2.Series.Add("TARGET")
    Chart2.Titles.Add("ON TIME EFFICIENCY")

    With Chart2.Titles(0)
        .Font = New Font("TAHOMA", 12, FontStyle.Bold)
    End With

    With Chart2.ChartAreas(0)
        '.AxisY.MajorGrid.Enabled = False
        .AxisX.MajorGrid.Enabled = False
        .AxisX.Title = "WEEKS"
        .AxisY.Title = "EFFICIENCY"
        .AxisX.Minimum = 0
        .AxisX.Maximum = 53
        .AxisY.Minimum = 0
        .AxisX.Interval = 1
        .AxisY.LabelStyle.Format = Format(0, "0%")
    End With

    With Chart2.Series(0)
        .Font = New Font(Me.Font.Name, 7, FontStyle.Regular)
        .SmartLabelStyle.Enabled = False
        .LabelAngle = -90
        .Label = "#VAL{P}"
        .IsValueShownAsLabel = True
        .Name = "WeeklyEfficiency"
        .ChartType = SeriesChartType.Column
        .LabelToolTip = Enabled
        .ToolTip = "WEEK #VALX" & vbNewLine & "#VAL{P}"
        .BorderColor = Color.Black
        .LabelForeColor = Color.Transparent
        Dim area As String = cbArea.Text
        Select Case area
            Case "BC_PICKUP"
                .Color = Color.Blue
            Case "BC_DELIVERY"
                .Color = Color.Blue
            Case "RAW"
                .Color = Color.LimeGreen
            Case "RTV"
                .Color = Color.Yellow
            Case Else
                .Color = Color.Black
        End Select
        'LOAD DATA POINTS
        .Points.AddXY(0, 0)
        .Points.AddXY(1, lblDeliveryStat1.Text)
        .Points.AddXY(2, lblDeliveryStat2.Text)
        .Points.AddXY(3, lblDeliveryStat3.Text)
        .Points.AddXY(4, lblDeliveryStat4.Text)
        .Points.AddXY(5, lblDeliveryStat5.Text)
        .Points.AddXY(6, lblDeliveryStat6.Text)
        .Points.AddXY(7, lblDeliveryStat7.Text)
        .Points.AddXY(8, lblDeliveryStat8.Text)
        .Points.AddXY(9, lblDeliveryStat9.Text)
        .Points.AddXY(10, lblDeliveryStat10.Text)
        .Points.AddXY(11, lblDeliveryStat11.Text)
        .Points.AddXY(12, lblDeliveryStat12.Text)
        .Points.AddXY(13, lblDeliveryStat13.Text)
        .Points.AddXY(14, lblDeliveryStat14.Text)
        .Points.AddXY(15, lblDeliveryStat15.Text)
        .Points.AddXY(16, lblDeliveryStat16.Text)
        .Points.AddXY(17, lblDeliveryStat17.Text)
        .Points.AddXY(18, lblDeliveryStat18.Text)
        .Points.AddXY(19, lblDeliveryStat19.Text)
        .Points.AddXY(20, lblDeliveryStat20.Text)
        .Points.AddXY(21, lblDeliveryStat21.Text)
        .Points.AddXY(22, lblDeliveryStat22.Text)
        .Points.AddXY(23, lblDeliveryStat23.Text)
        .Points.AddXY(24, lblDeliveryStat24.Text)
        .Points.AddXY(25, lblDeliveryStat25.Text)
        .Points.AddXY(26, lblDeliveryStat26.Text)
        .Points.AddXY(27, lblDeliveryStat27.Text)
        .Points.AddXY(28, lblDeliveryStat28.Text)
        .Points.AddXY(29, lblDeliveryStat29.Text)
        .Points.AddXY(30, lblDeliveryStat30.Text)
        .Points.AddXY(31, lblDeliveryStat33.Text)
        .Points.AddXY(32, lblDeliveryStat32.Text)
        .Points.AddXY(33, lblDeliveryStat33.Text)
        .Points.AddXY(34, lblDeliveryStat34.Text)
        .Points.AddXY(35, lblDeliveryStat35.Text)
        .Points.AddXY(36, lblDeliveryStat36.Text)
        .Points.AddXY(37, lblDeliveryStat37.Text)
        .Points.AddXY(38, lblDeliveryStat38.Text)
        .Points.AddXY(39, lblDeliveryStat39.Text)
        .Points.AddXY(40, lblDeliveryStat40.Text)
        .Points.AddXY(41, lblDeliveryStat41.Text)
        .Points.AddXY(42, lblDeliveryStat42.Text)
        .Points.AddXY(43, lblDeliveryStat43.Text)
        .Points.AddXY(44, lblDeliveryStat44.Text)
        .Points.AddXY(45, lblDeliveryStat45.Text)
        .Points.AddXY(46, lblDeliveryStat46.Text)
        .Points.AddXY(47, lblDeliveryStat47.Text)
        .Points.AddXY(48, lblDeliveryStat48.Text)
        .Points.AddXY(49, lblDeliveryStat49.Text)
        .Points.AddXY(50, lblDeliveryStat50.Text)
        .Points.AddXY(51, lblDeliveryStat51.Text)
        .Points.AddXY(52, lblDeliveryStat52.Text)
        .Points.AddXY(53, 0)
    End With

    With Chart2.Series("TARGET")
        .Name = "TARGET"
        .ChartType = SeriesChartType.Line
        .Color = Color.Red
        .BorderWidth = 3
        With .Points
            .AddXY(0, 1)
            .AddXY(1, 1)
            .AddXY(2, 1)
            .AddXY(3, 1)
            .AddXY(4, 1)
            .AddXY(5, 1)
            .AddXY(6, 1)
            .AddXY(7, 1)
            .AddXY(8, 1)
            .AddXY(9, 1)
            .AddXY(10, 1)
            .AddXY(11, 1)
            .AddXY(12, 1)
            .AddXY(13, 1)
            .AddXY(14, 1)
            .AddXY(15, 1)
            .AddXY(16, 1)
            .AddXY(17, 1)
            .AddXY(18, 1)
            .AddXY(19, 1)
            .AddXY(20, 1)
            .AddXY(21, 1)
            .AddXY(22, 1)
            .AddXY(23, 1)
            .AddXY(24, 1)
            .AddXY(25, 1)
            .AddXY(26, 1)
            .AddXY(27, 1)
            .AddXY(28, 1)
            .AddXY(29, 1)
            .AddXY(30, 1)
            .AddXY(31, 1)
            .AddXY(32, 1)
            .AddXY(33, 1)
            .AddXY(34, 1)
            .AddXY(35, 1)
            .AddXY(36, 1)
            .AddXY(37, 1)
            .AddXY(38, 1)
            .AddXY(39, 1)
            .AddXY(40, 1)
            .AddXY(41, 1)
            .AddXY(42, 1)
            .AddXY(43, 1)
            .AddXY(44, 1)
            .AddXY(45, 1)
            .AddXY(46, 1)
            .AddXY(47, 1)
            .AddXY(48, 1)
            .AddXY(49, 1)
            .AddXY(50, 1)
            .AddXY(51, 1)
            .AddXY(52, 1)
            .AddXY(53, 1)
        End With
    End With
End Sub

【问题讨论】:

  • AddXY(53, 1) 这些都是你手动输入的吗?使用循环。
  • 请用您正在使用的编程语言(SQL 除外)标记您的问题。
  • Johnbot,我添加了查询。
  • 这可能更适合代码审查网站。
  • 发出 104 个查询以在一个表单上加载标签... 这些标签的含义是否相似?考虑改用一个返回 104 个结果的查询,您可能会使其速度提高 100 倍。

标签: sql vb.net collections iteration performance


【解决方案1】:

我正在开发的来电显示程序遇到了类似的问题当用户带回超过几百条通话记录时,它会永远占用

我的方法是在开始时只查询数据库一次,然后在数据集上使用 linq 以带回单个数据

伊恩

Private Sub LoadWeeklyStats()
'Get Global DataSource Here 
For i As Integer = 0 To 51
    Dim LabelWkEff As String = "LblWkEff" + (i + 1).ToString
    Dim myArray1 As Array = Controls.Find(LabelWkEff, False)
    Dim myControl1 As Label = myArray1(0)
    myControl1.Text = RESULT1
    'AND
    Dim LabelDeliveryStat As String = "lblDeliveryStat" + (i + 1).ToString
    Dim myArray2 As Array = Controls.Find(LabelDeliveryStat, False)
    Dim myControl2 As Label = myArray2(0)
    myControl2.Text = RESULT2
    'COUNTER
    Week(i + 1)
Next

【讨论】:

    猜你喜欢
    • 2015-07-18
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 2011-10-09
    相关资源
    最近更新 更多