DataReader运行非常慢

时间:2018-12-27 11:44:04

标签: sql sql-server vb.net ssms

我目前正在使用一个超过5000万条记录的数据库,在其中读取了一个人想要搜索数据库的文件,等等。我注意到我的数据读取器部分运行特别慢,因为查询似乎几乎是即时的(数据库已建立索引)。我只是想知道是否有人知道为什么它运行缓慢?

con.Open()         使用sw作为New StreamWriter(“ G:\ USER \ SEARCH-RESULTS.txt”)             试试

            For Each word As String In result

                Using com As New SqlCommand("select t.SmeNbr, t.FilPth, r.MaxDate, t.DteAdd, t.LnePos from (Select SmeNbr, MAX(FilDte) as MaxDate from Test_Table where SmeNbr = @word group by SmeNbr)r inner join Test_Table t on  t.SmeNbr = r.SmeNbr and t.FilDte = R.MaxDate", con)
                    com.Parameters.AddWithValue("@word", word)
                    Using RDR = com.ExecuteReader

                        If RDR.HasRows Then
                            Do While RDR.Read
                                MyFilePath = RDR.Item("FilPth").ToString()
                                linePos = RDR.Item("LnePos").ToString()

                                Using sr As New StreamReader(MyFilePath)
                                    sr.BaseStream.Seek(4096 * (linePos - 1), SeekOrigin.Begin)
                                    FoundWords.Add(sr.ReadLine)
                                    For Each item As String In FoundWords
                                        sw.WriteLine(item)

                                    Next
                                    FoundWords.Clear()
                                End Using
                            Loop

                        Else

                            Continue For

                        End If
                    End Using



                End Using





            Next

    Catch ex As Exception
    MessageBox.Show("Couldn't process search")
    Finally
    con.Close()

    End Try
    End Using
    MsgBox("Complete!")

所以它运行完美,因为它可以通过查询非常快速地获取我想要的记录和信息位,并且几乎所有内容甚至写入新文件的结果都近在咫尺,我使用了断点,就像我说的那样,年龄介于“使用RDR = com.ExecuteReader”和“如果RDR.HasRows然后”之间

任何帮助或想法都将不胜感激。

1 个答案:

答案 0 :(得分:3)

  

com.Parameters.AddWithValue(“ @ word”,word)

AddWithValue从提供的.NET对象值中推断参数数据类型。由于.NET字符串是Unicode,因此此代码将添加一个带有实际值长度的nvarchar(n)参数。我从您的评论中看到,实际的列数据类型为char(13),因此最好将其明确指定为参数数据类型:

com.Parameters.Add("@word", SqlDbType.Char, 13).Value = word

AddWithValue的含义是,由于数据类型不匹配,可能不使用索引,并且SQL Server过程高速缓存中同一查询的变化可能很多,只是长度不同。由于这些原因,我建议一个avoid AddWithValue