【发布时间】:2018-02-21 08:48:57
【问题描述】:
我在 vb.net 中有一个二维数组(出于测试目的,它只有 1000 行,但实际最多 2.5m)。
数组可以分成三组,分别依赖于SQL server中的两个字段,TD和UID:
- TDnomatch
- TDmatchUIDmatch
- TDmatchUIDnomatch
我的原始代码只是循环遍历数组的每一行
显示结构的伪代码
for row_id = 0 to upper_bound
"select ... where TD = " & Pricetable(0, rowid)
executereader
if sqlreader.Hasrows()
... (getting UID from reader and other validation)
closereader
If UID <> UID_VBarray
"delete from ... "
executenonquery
InsertPrices(command, UID, rowid)
end if
else
closereader
InsertPrices(command, UID, rowid)
end if
next row_id
这非常慢,1200 条记录大约需要 3 分钟。我认为这是因为 sql server 和 vb.net 之间的所有开销通信。
所以我想尽量减少查询量,但问题是我应该在 SQL Server 还是在 vb.net 中执行逻辑。
将每条记录(TD、UID)从 sql server 读入 vb.net 中的另一个数组似乎有点过头了(更不用说我可能需要更多的 ram 哈哈),但是逻辑很简单,我可以做到一些插入。
我可以将整个数组发送到 SQL Server 吗?是否建议发送带有 where ... IN / not in 的查询(250 万个元素的列表)(显然使用循环连接构建字符串)
【问题讨论】:
-
将数据放入数据库,添加适当的索引并编写一个查询,返回您想要的结果。
-
"select ... where TD = " & Pricetable(0, rowid)- 没有。如果您仍然希望在客户端使用它,请一次或部分地从数据库中读取它。您可能已经找到了执行此操作的最慢方法。 -
@Panagiotis Kanavos - 不要什么?被删除的行必须被删除,因为它们不再是真实的。 (因分拆和分红而变动前的股价)
-
我正在回复标题 - 不要将数据拉到客户端,这是可能的最慢方式。您可以通过 LEFT JOIN 找到差异。您可以在 INSERT 或 DELETE 语句的 FROM 子句中使用 LEFT JOIN,这意味着您可以轻松编写语句来删除丢失的记录或添加新记录。如果 JOIN 中使用的列是索引的一部分(通常是主键),则性能会非常快
-
由于您必须在 SQL Server 上添加和更新行,那么最好的办法是使用 SqlBulkCopy() 将包含 250 万行的数组注入到临时表中。然后使用 SQL 语句(如 MERGE)来比较和更新 SQLServer 中的永久表。
标签: arrays sql-server vb.net performance logic