Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Access 2007 VBA-大型数据集-如何优化此查询/代码?_Sql_Ms Access_Vba - Fatal编程技术网

Sql Access 2007 VBA-大型数据集-如何优化此查询/代码?

Sql Access 2007 VBA-大型数据集-如何优化此查询/代码?,sql,ms-access,vba,Sql,Ms Access,Vba,我得到了一个Access数据库,其中包括12个数据表,每个表包含大约200000行。每个表都包含大约200栋建筑的月度数据。我不想花太多时间规范化数据库,我只是编写了一个快速脚本,用这些数据为每个建筑创建一个表 话虽如此,我的代码运行大约需要1.5个小时。我能做些什么来加速这一进程,或者我只是达到了访问能力的极限?如有任何建议,将不胜感激 Sub RunQueryForEachBuilding() Dim RRRdb As DAO.Database Dim rstBuildNames As D

我得到了一个Access数据库,其中包括12个数据表,每个表包含大约200000行。每个表都包含大约200栋建筑的月度数据。我不想花太多时间规范化数据库,我只是编写了一个快速脚本,用这些数据为每个建筑创建一个表

话虽如此,我的代码运行大约需要1.5个小时。我能做些什么来加速这一进程,或者我只是达到了访问能力的极限?如有任何建议,将不胜感激

Sub RunQueryForEachBuilding()

Dim RRRdb As DAO.Database
Dim rstBuildNames As DAO.Recordset
Dim rstDataTables As DAO.Recordset
Dim rstMonthlyData As DAO.Recordset
Dim strSQL As String
Dim sqlCreateT As String
Dim sqlBuildData As String
Dim strDataTable As String
Dim sqlDrop As String


On Error GoTo ErrorHandler
'open recordsets for building names and datatables
Set RRRdb = CurrentDb
Set rstBuildNames = RRRdb.OpenRecordset("BuildingNames")
Set rstDataTables = RRRdb.OpenRecordset("DataTables")

 Do Until rstBuildNames.EOF
    ' Create a table for each building.
    ' Check if table exists, if it does delete and recreate.

    If Not IsNull(DLookup("Name", "MSysObjects", "Name='" & rstBuildNames.Fields("BuildingPath") & "'")) Then
        '  Table Exists - delete existing
        sqlDrop = "DROP TABLE [" & rstBuildNames.Fields("BuildingPath") & "]"

        RRRdb.Execute sqlDrop
        ' re-create blank table
    End If
    'create table for this building
    sqlCreateT = "CREATE TABLE [" & rstBuildNames.Fields("BuildingPath") & _
    "] (BuildingPath VARCHAR, [TimeStamp] DATETIME, CHWmmBTU DOUBLE , ElectricmmBTU DOUBLE, kW DOUBLE, kWSolar DOUBLE, kWh DOUBLE, kWhSolar DOUBLE)"

    RRRdb.Execute sqlCreateT

'populate data from monthly table into the building name table.
 Do While Not rstDataTables.EOF
    ' get data from each monthly table for this building and APPEND to table.
    strDataTable = rstDataTables.Fields("[Data Table]")
    'Debug.Print strDataTable
    'create a SQL string that only selects records that are for the correct building & inserts them into the building table

    sqlBuildData = "INSERT INTO [" & rstBuildNames.Fields("BuildingPath")
    sqlBuildData = sqlBuildData & "] ([TimeStamp], [CHWmmBTU], [ElectricmmBTU], kW, [kWSolar], kWh, [kWhSolar], BuildingPath) "
    sqlBuildData = sqlBuildData & " SELECT [TimeStamp], [CHW mmBTU], [Electric mmBTU], kW, [kW Solar], kWh, [kWh Solar], BuildingPath FROM "
    sqlBuildData = sqlBuildData & rstDataTables.Fields("[Data Table]") & " WHERE BuildingPath LIKE '*" & rstBuildNames.Fields("BuildingPath") & "'"

    'Debug.Print sqlBuildData

    RRRdb.Execute sqlBuildData
    rstDataTables.MoveNext

Loop

rstBuildNames.MoveNext
rstDataTables.MoveFirst

Loop

Set rstBuildNames = Nothing
Set rstDataTables = Nothing

ErrorHandler:
 'MsgBox "Error #: " & Err.Number & vbCrLf & vbCrLf & Err.Description

End Sub

该代码删除,然后用相同的结构重新创建
rstBuildNames.Fields(“BuildingPath”)
。清空表格应该会更快:

“从中删除”&rstBuildNames.Fields(“BuildingPath”)
然而,这不太可能充分加快操作速度

INSERT
查询的
WHERE
子句强制执行完整表扫描

“其中BuildingPath类似于“*”&rstBuildNames.Fields(“BuildingPath”)&”
如果您可以使用精确的字符串匹配,而不是像比较那样使用
,并在
BuildingPath
上创建索引,您应该会看到显著的改进

“其中BuildingPath=”&rstBuildNames.Fields(“BuildingPath”)&“
我也建议使用
dbOpenSnapshot
,尽管这不会产生明显的区别,因为您只打开一次记录集。(这可能没什么帮助,但不会造成伤害。)

Set rstBuildNames=RRRdb.OpenRecordset(“BuildingNames”,dbOpenSnapshot)
Set rstDataTables=RRRdb.OpenRecordset(“DataTables”,dbOpenSnapshot)

该代码删除,然后重新创建具有相同结构的
rstBuildNames.Fields(“BuildingPath”)
。清空表格应该会更快:

“从中删除”&rstBuildNames.Fields(“BuildingPath”)
然而,这不太可能充分加快操作速度

INSERT
查询的
WHERE
子句强制执行完整表扫描

“其中BuildingPath类似于“*”&rstBuildNames.Fields(“BuildingPath”)&”
如果您可以使用精确的字符串匹配,而不是像
比较那样使用
,并在
BuildingPath
上创建索引,您应该会看到显著的改进

“其中BuildingPath=”&rstBuildNames.Fields(“BuildingPath”)&“
我也建议使用
dbOpenSnapshot
,尽管这不会产生明显的区别,因为您只打开一次记录集。(这可能没什么帮助,但不会造成伤害。)

Set rstBuildNames=RRRdb.OpenRecordset(“BuildingNames”,dbOpenSnapshot)
Set rstDataTables=RRRdb.OpenRecordset(“DataTables”,dbOpenSnapshot)

好的,谢谢,我要试试。好的,谢谢,我要试试。