这个过程执行要10分钟,其实就是两个连接,先从SqlServer的rpt_gsb表中读取计算公式,然后根据计算公式到oracle数据库中计算出数据来,最后把数据再写入到SqlServer数据库的datagrid1所绑定的表中。两个循环,第一层30个,第二层也才40不到,奇怪执行速度就是慢!我是新手水平有限,请高手不吝赐教!   Sub Query_Click(ByVal sender As Object, ByVal e As EventArgs)
        Dim dataR1 As OracleDataReader
        Dim ds1 As DataSet
        Dim cmd2 As SqlCommand
        Dim cmd1 As OracleCommand
        Dim str1, str3, qsrq, jzrq As String
        Dim i, j, sql_exe As Integer
        Dim sj(100) As Decimal        For i = 0 To 99
            sj(i) = 0
        Next        Msg.Text = ""
        cnn1 = New SqlConnection(ConfigurationSettings.AppSettings("connection"))
        Cnn = New OracleConnection(ConfigurationSettings.AppSettings("connection1"))
        Try
            cnn1.Open()
            str1 = "update unit_report set sj01='',sj02='',sj03='',sj04='',sj05='',sj06='',sj07='',sj08='',sj09='',sj10='',sj11='',sj12='',sj13='',sj14='',sj15='',sj16='',sj17='',sj18='',sj19='',sj20='',sj21='',sj22='',sj23='',sj24='',sj25='',sj26='',sj27='',sj28='',sj29='',sj30=''"
            cmd2 = New SqlCommand(str1, cnn1)
            cmd2.ExecuteNonQuery()            str1 = "select * from rpt_gsb where rpt_code='" + Drop_rpt.SelectedValue + "' order by sw"
            dtcmd = New SqlDataAdapter(str1, cnn1)
            ds1 = New DataSet
            dtcmd.Fill(ds1, "rpt_gsb")
            DataGrid1.Width = ds1.Tables("rpt_gsb").Rows.Count * 52
            For j = 0 To DataGrid1.Items.Count - 1
                sql_exe = 0
                str1 = "update unit_report set "
                For i = 1 To ds1.Tables("rpt_gsb").Rows.Count
                    If j = 0 Then DataGrid1.Columns(i + 2).HeaderText = ds1.Tables("rpt_gsb").Rows(i - 1).Item("title").ToString()
                    If ds1.Tables("rpt_gsb").Rows(i - 1).Item("js_code") = 1 Then
                        If ds1.Tables("rpt_gsb").Rows(i - 1).Item("history") = 1 Then
                            qsrq = CStr(CInt(Left(tj_qsrq.Text, 4)) - 1) + Right(tj_qsrq.Text, 4)
                            jzrq = CStr(CInt(Left(tj_jzrq.Text, 4)) - 1) + Right(tj_jzrq.Text, 4)
                            If DataGrid1.Items.Item(j).Cells(3).Text = "1" Then
                                str3 = ds1.Tables("rpt_gsb").Rows(i - 1).Item("sql_code") + " and sta_date>='" + qsrq + "' and sta_date<='" + jzrq + "' and unit_code='" + Trim(DataGrid1.Items.Item(j).Cells(1).Text) + "'"
                            Else
                                str3 = ds1.Tables("rpt_gsb").Rows(i - 1).Item("sql_code") + " and sta_date>='" + qsrq + "' and sta_date<='" + jzrq + "'"
                            End If
                        Else
                            If DataGrid1.Items.Item(j).Cells(3).Text = "1" Then
                                str3 = ds1.Tables("rpt_gsb").Rows(i - 1).Item("sql_code") + " and sta_date>='" + tj_qsrq.Text + "' and sta_date<='" + tj_jzrq.Text + "' and unit_code='" + Trim(DataGrid1.Items.Item(j).Cells(1).Text) + "'"
                            Else
                                str3 = ds1.Tables("rpt_gsb").Rows(i - 1).Item("sql_code") + " and sta_date>='" + tj_qsrq.Text + "' and sta_date<='" + tj_jzrq.Text + "'"
                            End If
                        End If
                        str3 = Left(str3, str3.IndexOf("from")) + " as nums " + Mid(str3, str3.IndexOf("from") + 1, str3.Length)
                        cmd1 = New OracleCommand(str3, Cnn)
                        Try
                            Cnn.Open()
                            dataR1 = Nothing
                            dataR1 = cmd1.ExecuteReader(CommandBehavior.CloseConnection)
                            If dataR1.Read() Then
                                If IsDBNull(dataR1("nums")) Then
                                    sj(i) = 0
                                Else
                                    sj(i) = dataR1("nums")
                                End If
                                If sj(i) > 0 Then
                                    sql_exe = 1
                                    Select Case ds1.Tables("rpt_gsb").Rows(i - 1).Item("format")
                                        Case 0
                                            str1 = str1 + "sj" + i.ToString("00") + "='" + Format(sj(i), "0").ToString + "',"
                                        Case 1
                                            str1 = str1 + "sj" + i.ToString("00") + "='" + Format(sj(i), "###0.0").ToString + "',"
                                        Case Else
                                            str1 = str1 + "sj" + i.ToString("00") + "='" + Format(sj(i), "###0.00").ToString + "',"
                                    End Select
                                End If
                                dataR1.Close()
                            End If
                        Finally
                            Cnn.Close()
                        End Try
                    Else
                        If ds1.Tables("rpt_gsb").Rows(i - 1).Item("js_code") = 2 Then
                            If sj(i - 2) = 0 And sj(i - 1) > 0 Then
                                sql_exe = 1
                                str1 = str1 + "sj" + i.ToString("00") + "='100.0',"
                            Else
                                If sj(i - 2) > 0 Then
                                    sql_exe = 1
                                    sj(i) = 100 * (sj(i - 1) - sj(i - 2)) / sj(i - 2)
                                    str1 = str1 + "sj" + i.ToString("00") + "='" + Format(sj(i), "###0.0").ToString + "',"
                                End If
                            End If
                        End If
                        If ds1.Tables("rpt_gsb").Rows(i - 1).Item("js_code") = 3 Then
                            If sj(i - 2) > 0 Then
                                sql_exe = 1
                                sj(i) = sj(i - 1) / sj(i - 2)
                                str1 = str1 + "sj" + i.ToString("00") + "='" + Format(sj(i), "###0.0").ToString + "',"
                            End If
                        End If
                    End If
                Next
                If sql_exe = 1 Then
                    str1 = Mid(str1, 1, str1.Length - 1)
                    str1 = str1 + " where dwlh='" + Trim(DataGrid1.Items.Item(j).Cells(1).Text) + "'"
                    cmd2 = New SqlCommand(str1, cnn1)
                    cmd2.ExecuteNonQuery()
                Else
                    DataGrid1.Items.Item(j).Visible = False
                End If
            Next
        Finally
            Cnn.Close()
            cnn1.Close()
        End Try
        BindGrid()
    End Sub

解决方案 »

  1.   

    你用sql 2005 profile工具监视一下数据库语句的执行情况,再打开任务管理器,监测一下CPU是不是很高,如果高的话,看是那个进程引起的,是asp_wp还是sqlserver,如果是wp就是asp.net中的运算费资源了,如果是sqlserver进程,就是数据库耗费资源了。这样你就应该能了解到到底是哪里。如果是数据库运行的慢,看profile的跟踪是那句代码,然后再作相应的优化调整。
      

  2.   

    先给数据库加引索引试试,如果还慢,把页面的ViewState也关掉试试
      

  3.   

    首先要知道是哪错了,  把你的SQL语句扔到 SQL 里执行下, 看看时间.  如果SQL 就执行就很忙。 那就说明你要优化SQL了 .如果SQL快, 那就说明你页面处理有问题。 需要改进. 
      

  4.   

       谢谢各位高手,我查看了下,我在这个数据库中,还执行了一个模块就是每3分钟从异地数据库中接收数据,这个也会影响时间,但如果没有这个的话,也要5分钟左右,这也慢。
    我主要问我上述代码怎么优化?是不是用dataset的updata写数据库方式代替ExecuteNonQuery是不是会好点。
      

  5.   

     str1 = "select * from rpt_gsb where rpt_code='" + Drop_rpt.SelectedValue + "' order by sw"
    干嘛 * 扫描整个表呢
      

  6.   

    rpt_gsb 的记录很少,只有几条,应该不是这个原因吧。
    另:我运行sql 2005 profile工具,发现audit logout,然后audit Login,是不是这个原因?