通过VBA优化4000 SELECTsearch的SQL SELECT

如何通过配料或其他技术来优化速度? 它是一个20MB的Access2003数据库,我从Excel 2003 VBAsearch。

我有我的访问表键控(自动编号),所以我虽然这将提供像二进制search智能非线性search。 目前从147klogging表中search4000个值需要4.2分钟。

我在search中find了这个:

在SQL Server端直接SELECT的问题是数据库将通过表进行线性search,除非您正在使用的列上有一个索引; 那么数据库可以更聪明。 StackOverflow SQL C#二进制search问题

这是真的,它也适用于Access2003 DB?

VBA代码,例子:

Dim cnn As ADODB.Connection Dim rst As ADODB.Recordset Set cnn = New ADODB.Connection 'open the connection With cnn .Provider = "Microsoft.Jet.OLEDB.4.0" .Open "PNdb2003.mdb" End With 'define the record set Set rst = New ADODB.Recordset rst.CursorLocation = adUseClient 'for smaller datasets that fit into RAM For Each myVariant In Selection.Cells strSearchText = myVariant Dim sSQL As String sSQL = "SELECT Key FROM [MasterTable] WHERE PN=""" & strSearchText & """" rst.Open Source:=sSQL, ActiveConnection:=cnn, CursorType:=adOpenStatic, LockType:=adLockOptimistic Cells(myVariant.Row, 7).CopyFromRecordset rst rst.Close Next myVariant cnn.Close 

当您声明“访问表键控”是这个PN字段相同的字段? 如果没有,我怀疑它不是,那么在PN字段上创build索引将大大提高性能。 你也应该为你做任何search的其他领域做这个。 即使对布尔型字段进行索引,也可以在search时产生显着的差异,但在比较之前和之后进行search。

是的,除非您的select包含索引字段,否则主键(或聚集索引)search通常会线性执行,因为无法确定数据顺序或布局的任何查询优化。

如何在Excel工作簿中的表与Access数据库中的表之间创buildSQL JOIN ,获取结果集一次 ,最重要的是按照与工作簿相同的顺序,然后使用CopyFromRecordset 一次来填充工作簿中的所有行一去。 我想这会比打开四千次的logging集快几个数量级。

更新

你可以提供如何joinExcel电子表格和Access表的SQL

像这样的东西:

 SELECT A1.customer_number FROM [MS Access;Database=C:\Tempo\New_Jet_DB.mdb;].Customers AS A1 LEFT OUTER JOIN [Excel 8.0;HDR=YES;IMEX=1;Database=C:\db.xls;].[Sheet1$] AS E1 ON A1.customer_number = E1.col1; 

基于您的代码示例看起来最明显的优化提示是:

1)确保在MasterTable.PN上有一个索引。 这对于最大化性能和最小化表扫描是绝对必要的。

2)尝试组合参数并在单个查询中运行它们,而不是4000个单独的查询。 也许有一个IN语句连接你感兴趣的所有值。这不是100%保证更快,但根据我的经验,往往会有这样一个循环运行多个查询的开销吨。

重要提示:不要采取这些优化措施,多次testing每个版本,以确认在特定情况下它们确实速度更快。 你的旅费可能会改变。