我目前正在使用一个超过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然后”之间
任何帮助或想法都将不胜感激。
答案 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。