【发布时间】:2019-04-11 10:28:55
【问题描述】:
所以快速总结一下,我有一个 sqlServer 数据库(使用 SSMS 来处理它),它有一个带有 order_num 列和一个 description 列的表.
例如 16548221587 | Small hairbrush. 我在 order_num 列上有索引。
然后我有一个 VB.net 应用程序,基本上我希望它允许用户放置一个 .txt 文件,其中包含大量 order_nums 列表(>150,000,每行 1 个)及其内容确实是逐行读取这些,然后搜索数据库,将其全部添加到临时表中,然后将 streamwrites 它添加到“结果”.txt 文件中。
关于这个问题的标题,我问它是因为我将在下面发布的代码有效!我在阅读和查找并将每个查找插入到临时表中的时间为 0.427 秒搜索,但将其与 150,000 条记录一起查看它需要 16 多个小时!所以这就是我想知道我这样做是一种颠倒的方式还是我期望太多阅读/查找和检索那么多记录并期望它更快?
If System.IO.File.Exists(TextBox2.Text) Then
'read in file list of order numbers to search
result = From n In System.IO.File.ReadLines(TextBox2.Text)
Where n.Length = 13
Select n.Substring(0, 13)
Else
MessageBox.Show("The file path you entered seems to be invalid. Please try again.")
Exit Sub
End If
For Each word As String In result
Dim cmd As New SqlCommand("dbo.OrdersToTemp", con)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@OrderNum", SqlDbType.NVarChar).Value = word.ToString()
cmd.CommandTimeout = 3000
cmd.ExecuteNonQuery()
Next
Using sw As New StreamWriter(TextBox2.Text.Substring(0, TextBox2.TextLength - 4) + "-results.txt")
Dim retrieveResults As New SqlCommand("dbo.GetResults", con)
retrieveResults.CommandType = CommandType.StoredProcedure
retrieveResults.CommandTimeout = 3000
Using RDR = retrieveResults.ExecuteReader
Do While RDR.Read
OrderDescription = RDR("Description").ToString()
sw.WriteLine(OrderDescription )
Loop
End Using
End Using
更新
我已经对此提出了一些建议,现在我将需要搜索的 order_nums sqlbulkcopy 到 Temp 表中,这完成得非常快。然后我正在使用诸如
之类的查询SELECT o.order_num, description
from OrderTable o
join TempOrderIdTable t on t.order_num = o.order_num
但是即使只有 170 个结果也需要 30 秒,这在我看来还是很慢的。我在 order_table 中的 order_num 上放置了一个聚集索引,而在 temp 表上放置了 NO 索引,它基本上只是 .txt 文件,除了在 sql 表中
更新 2
所以就像我说的,我现在在 OrderTable 上有一个非聚集索引(orderNo 包含描述),在 TempTable 上有一个聚集索引(Order_num),但是任何类型的连接或交叉应用等仍然需要 33 秒以上才能基本上加入100 OrderNum 并仅返回 170,这仍然很慢。这是我正在尝试的连接:
select o.Order_num, t.description
from Temp_data o
join OrderTable on t.Order_num= o.Order_num
select x.Order_num, x.description
from OrderTable x
where Order_num in (select Order_num from Temp_data)
select x.Order_num,x.description
from OrderTable x
cross apply (select o.Order_num from Temp_data o where o.Order_num= x.Order_num) ord
已解决 所以最后一点是我是个白痴,当我制作临时表时,你基本上都是正确的,我不小心将列设置为 nvarchar,而在实际的 OrderTable 中,它只是 order_num 的 varchar 列。对不起,我半睡半醒!
【问题讨论】:
-
索引该临时表的 order_num 列。
标签: sql sql-server vb.net streamreader streamwriter