【发布时间】:2020-11-05 15:05:00
【问题描述】:
我正在尝试构建查询,以便将大量数据插入到 sqlite3 表中。我已经尝试了几种方法来做到这一点,包括PSSQLite,它应该能够获取一个 DataTable 并轻松插入它。即使只有 10,000 条记录,它也需要将近 40 分钟才能运行,我不知道为什么。
我的另一个选择是构建一个查询并使用另一种方法(例如 Invoke-Sqlcmd)执行它。我试过用 StringBuilder 来做这件事,只是构建字符串需要 2 多分钟。就像我说的,它只有 10,000 条记录,所以根据我准备的内容,TOPS 应该只需要 10-15 秒。考虑到我至少有几百万条记录要导入,我真的需要它来加快速度。
这是我正在使用的代码。我只是在这里遗漏了什么吗?
$sb = [System.Text.StringBuilder]::new()
$sb.AppendLine("BEGIN TRANSACTION")
foreach ($document in $documents) {
$null = $sb.AppendLine("INSERT or IGNORE into documents(DocId,Submid,docno,Tray,Pieceno,CreateDate,Account,AccName,AccAddr1,AccAddr2,AccAddr3,AccAddr4,AccCity,AccState,AccZip,BCDP,BarcodeID,ServTypeID,Mailerid,SerialNo,Sys_Name,Sys_Addr1,Sys_Addr2,Sys_Addr3,Sys_Addr4,Sys_City,Sys_State,Sys_Zip)");
$null = $sb.AppendLine("VALUES('$($document.DocId)','$($document.Submid)','$($document.docno)','$($document.Tray)','$($document.Pieceno)','$($document.CreateDate)','$($document.Account)','$($document.AccName)','$($document.AccAddr1)','$($document.AccAddr2)','$($document.AccAddr3)','$($document.AccAddr4)','$($document.AccCity)','$($document.AccState)','$($document.AccZip)','$($document.BCDP)','$($document.BarcodeID)','$($document.ServTypeID)','$($document.Mailerid)','$($document.SerialNo)','$($document.Sys_Name)','$($document.Sys_Addr1)','$($document.Sys_Addr2)','$($document.Sys_Addr3)','$($document.Sys_Addr4)','$($document.Sys_City)','$($document.Sys_State)','$($document.Sys_Zip)')")
}
$sb.AppendLine("COMMIT")
$query = $sb.ToString();
#Invoke-SqliteQuery $ref_db $query #commenting this out, because I haven't even attempted the insert because StringBuilder is not optimized enough yet.
在这种情况下,$documents 是一个通用对象,包含 INSERT 语句中的每个字段。大多数字段都是用字符串填充的,有些是空白的。
#EDIT:我在设置了断点的 Powershell ISE 中运行它,这会导致性能问题吗?
【问题讨论】:
-
这实际上是字符串生成器的性能吗?或者更确切地说是 PSqlite 的性能?
-
可能是因为 pssqlite 尝试填充结果集,我没有看到非查询选项(?)
-
我建议构建一个一次插入多条记录的 SQL 语句。而且我总是使用存储过程而不是用户提供的数据。
-
我编辑了我的问题,因为它具有误导性。我什至没有运行我使用 StringBuilder 创建的查询,因为它太慢了,无法满足我的需要。构建查询本身花费的时间太长。
标签: sql string powershell sqlite stringbuilder