Me preguntaba si alguien puede tener alguna sugerencia para acelerar las consultas en una base de datos de acceso. Mis disculpas si esta es una publicación larga, pero la configuración es un poco fuera de lo común ...

Estoy en el proceso de crear una base de datos de Access para informar sobre estadísticas de eventos recopiladas de un sistema mainframe. El planificador de mainframe actual que usamos (ZEKE) no tiene exactamente características de informes sólidas, por lo que estoy exportando datos de eventos diarios para informar. También tengo una lista maestra de una fuente separada (que es una lista estática y no cambiará de forma regular) que enumera todas las aplicaciones individuales, incluido el código de la aplicación (que es el estándar de nomenclatura para las ejecuciones de producción) y el nombre del programador, coordinador, gerente, unidad de negocios, etc. para esa aplicación específica. La base de datos está configurada para que el usuario pueda buscar por cualquier campo, código de aplicación, programador, coordinador, etc. Elija el centro de producción para buscar (hay 5) o por defecto para todos, y elija todas las fechas, una sola fecha , o un rango de fechas. la consulta funciona tomando los parámetros de búsqueda y comenzando con el código de la aplicación o la persona. Busca aplicaciones en la tabla y copia todos los registros relevantes en una tabla temporal para generar informes. Por ejemplo, si quiero ver cuántas fallas tuvo el coordinador de aplicaciones John Doe durante la última semana para todas las aplicaciones de las que es responsable, la consulta movería todos los registros de aplicaciones que incluyen a John Doe como coordinador a la tabla temporal. A partir de ahí, se mueve a través de la tabla temporal para cada aplicación y busca en los datos de eventos eventos bajo ese código de aplicación que cumplan con los criterios ingresados ​​por fecha, centro de producción y tipo de evento (éxito, falla o ambos). Esto se mueve a una tabla temporal para el informe final que luego se genera.

Tal como está ahora, mi código funciona y hace exactamente lo que quiero, el problema es que la tabla de datos de eventos está actualmente en 2.5 millones de líneas (esto equivale a 15 días de datos) y está creciendo diariamente. Puse el back end en una unidad NAS recién creada en nuestra red y ejecuté una prueba ... Funcionó, pero un informe que tardó 2 minutos en ejecutarse cuando el back end y el front end estaban en la misma máquina ahora toma 29 minutos. Ponerlo en la red lo ha empantanado considerablemente. Creo que puedo tener algo de visión de túnel en términos de cómo tengo configurados mis bucles de búsqueda, y me pregunto si alguien puede tener sugerencias sobre formas mejores o más rápidas para agilizar las consultas para que puedan acelerar en una red. He incluido mi código a continuación. Esto funciona y produce informes como se esperaba, pero si hay un enfoque diferente para las consultas o una forma de simplificar, agradecería cualquier consejo. El código que he incluido es el código que se ejecuta desde el formulario de selección de criterios de informe y ejecuta el informe en función de la entrada del usuario.

'this macro will generate a report based on multiple input criteria.
'this report allows the user to slect:
'       date range, single date or all dates
'       type of events: Abends, Successes or both
'       centers to pull data from: OCC,QCC,BCC,ITS,DAIN, or ALL centers
'       The type of data to report on: App code, App Coordinator, Custodian, L3, L4 or L5
'Once the user has selected all of the required data and fields, the report will be generated
'based on the selection criteria.

'we begin by defining the active database as the currently open database
Dim db As DAO.Database
    Set db = DBEngine(0)(0)


On Error GoTo ErrorHandler

'Now we designate the variables which will be used in this macro

   Dim strSQ1 As String
   Dim strSQ2 As String
   Dim strSQ3 As String
   Dim strSQ4 As String
   Dim appl As String
   Dim evstatus As String
   Dim appletype As String
   Dim fullapp As String
   Dim length As Long
   Dim iipmname As String
   Dim iipmcoor As String
   Dim fullappnm As String
   Dim fullappcoor As String
   Dim kinddate As String
   Dim coor As String
Dim cust  As String
Dim appL3  As String
Dim appL4  As String
Dim appL5 As String

   Dim ctrOCC As String
   Dim ctrMTL As String
   Dim ctrBCC As String
   Dim ctrITS As String
   Dim ctrDAIN As String



'We will start by setting some default values

'We will ste the default values for center selection.
'We start by searching for terms we know are not there, then change them to
'valid search terms if the center is selected.

ctrOCC = "notOCC"
ctrMTL = "notMTL"
ctrBCC = "notBCC"
ctrITS = "notITS"
ctrDAIN = "notUSWM"
fullapp = "*"

'First we determine which event types the user wants to look for

state = Me![opt-status].Value

If state = 1 Then
evstatus = " [ev-status] = 'AEOJ'"
ElseIf state = 2 Then
evstatus = " [ev-status] = 'EOJ'"
ElseIf state = 3 Then
evstatus = " ([ev-status] = 'EOJ' OR [ev-status] = 'AEOJ')"
End If

'MsgBox "Event status pulled is:.. " & evstatus & "."

' Next up we will configure the date parameters based on the user input

If [grp-datesel] = 1 Then
Sdte = "1"
Edte = "9999999"
kinddate = "[ev-date] >= " & Sdte & " AND [ev-date] <= " & Edte & " "
End If

If [grp-datesel] = 2 Then
'error handling
If IsNull(Me.[sel-onedate]) Then
MsgBox "You have not entered a date to search....please try again."
Me.[sel-onedate] = Null
Me.[sel-onedate].SetFocus
Exit Sub
End If
'end of error handling

Dim currdte As Date
currdte = Me![sel-onedate].Value
currjul = Format(currdte, "yyyyy")
daycurr = CDbl(currjul)

Sdte = daycurr
Edte = daycurr
kinddate = "[ev-date] >= " & Sdte & " AND [ev-date] <= " & Edte & " "
End If

If [grp-datesel] = 3 Then

'error handling
If IsNull(Me.[sel-Sdate]) Or IsNull(Me.[sel-Edate]) Then
MsgBox "You Must enter a start and end date for the search....please try again."
Me.[sel-Sdate] = Null
Me.[sel-Edate] = Null
Me.[sel-Sdate].SetFocus
Exit Sub
End If
'end of error handling

Dim startdte As Date
Dim enddte As Date
startdte = Me.[sel-Sdate].Value
enddte = Me.[sel-Edate].Value

startjul = Format(startdte, "yyyyy")
endjul = Format(enddte, "yyyyy")
Sday = CDbl(startjul)
Eday = CDbl(endjul)

Sdte = Sday
Edte = Eday

'MsgBox "start date is " & Sdte & " and end date is " & Edte & "."

'check that dates are in proper chronological order
If Sdte > Edte Then
MsgBox "The start Date you entered is after the end date....please try again."
Me.[sel-Sdate] = Null
Me.[sel-Edate] = Null
Me.[sel-Sdate].SetFocus
Exit Sub
End If
'keep going if it's all good

kinddate = "[ev-date] >= " & Sdte & " AND [ev-date] <= " & Edte & " "
End If

MsgBox "Date used is:.. " & kinddate & "."

'Now lets look at center selection

If [chk-allctr].Value = True Then
ctrOCC = "OCC"
ctrMTL = "MTL"
ctrBCC = "BCC"
ctrITS = "ITS"
ctrDAIN = "USWM"

End If

If [chk-OCC].Value = True Then
ctrOCC = "OCC"
End If
If [chk-MTL].Value = True Then
ctrMTL = "MTL"
End If
If [chk-BCC].Value = True Then
ctrBCC = "BCC"
End If
If [chk-RTF].Value = True Then
ctrITS = "ITS"
End If
If [chk-DAIN].Value = True Then
ctrDAIN = "DAIN"
End If

'Error handling if no center is selected
If [chk-OCC].Value = Flase Then
If [chk-MTL].Value = Flase Then
If [chk-BCC].Value = Flase Then
If [chk-RTF].Value = Flase Then
If [chk-DAIN].Value = Flase Then
MsgBox "You have not selected a center to search search....please try again."
Me.[chk-allctr].SetFocus
Exit Sub
End If
End If
End If
End If
End If
'end of error handling

'MsgBox "centers used are: Chr(10) " & ctrOCC & " Chr(10) " & ctrBCC & " Chr(10) " & ctrMTL & " Chr(10) " & ctrITS & " Chr(10) " & ctrDAIN & " For this run"

'All good so far, now we will parse the application code if an
'application code report is selected

appl = "*"

If [opt-criteria].Value = 1 Then
'error handling
If IsNull(Me.[sel-appcode]) Then
MsgBox "You have not entered an application code to search....please try again."
Me.[sel-appcode] = Null
Me.[sel-appcode].SetFocus
Exit Sub
End If
'end of error handling
End If
If [opt-criteria].Value = 1 Then

appl = Me![sel-appcode].Value
End If

'trust = "no"
'If Mid(appl, 3, 2) = "RT" Then trust = "yes"

'length = Len(appl)
'If length = 2 Then appltype = "short"
'If length = 3 Then appltype = "long"

'If appltype = "short" Then fullapp = "" & appl & "00"
'If appltype = "long" Then fullapp = "" & appl & "0"

'If trust = "yes" Then fullapp = appl

'End If

fullapp = appl

'MsgBox "App to use is: " & appl & " fullapp code is " & fullapp & "."


'Now we set values if names are used

coor = "*"
cust = "*"
appL3 = "*"
appL4 = "*"
appL5 = "*"

If [opt-criteria].Value = 2 Then
'error handling
If IsNull(Me.[sel-coor]) Then
MsgBox "You have not entered a Coordinator to search....please try again."
Me.[sel-coor] = Null
Me.[sel-coor].SetFocus
Exit Sub
End If
'end of error handling

coor = Me![sel-coor].Value
'MsgBox "Coordinator report selected for: " & coor & "."
End If

If [opt-criteria].Value = 3 Then
'error handling
If IsNull(Me.[sel-custodian]) Then
MsgBox "You have not entered a Custodian to search....please try again."
Me.[sel-custodian] = Null
Me.[sel-custodian].SetFocus
Exit Sub
End If
'end of error handling
cust = Me![sel-custodian].Value
'MsgBox "Custodian report selected for: " & cust & "."
End If

If [opt-criteria].Value = 4 Then
'error handling
If IsNull(Me.[sel-L3]) Then
MsgBox "You have not entered an L3 to search....please try again."
Me.[sel-L3] = Null
Me.[sel-L3].SetFocus
Exit Sub
End If
'end of error handling

appL3 = Me![sel-L3].Value
'MsgBox "L3 report selected for: " & appL3 & "."
End If

If [opt-criteria].Value = 5 Then
'error handling
If IsNull(Me.[sel-L4]) Then
MsgBox "You have not entered an L4 to search....please try again."
Me.[sel-L4] = Null
Me.[sel-L4].SetFocus
Exit Sub
End If
'end of error handling

appL4 = Me![sel-L4].Value
'MsgBox "L4 report selected for: " & appL4 & "."
End If

If [opt-criteria].Value = 6 Then
'error handling
If IsNull(Me.[sel-L5]) Then
MsgBox "You have not entered an L5 to search....please try again."
Me.[sel-L5] = Null
Me.[sel-L5].SetFocus
Exit Sub
End If
'end of error handling

appL5 = Me![sel-L5].Value
'MsgBox "L5 report selected for: " & appL5 & "."
End If

'Most of these reports take a while to build with this macro, so to make sure the user
'knows that the macro is still working, we didsplay a splash screen. It's cute and has
'hamsters, cause everyone loves hamsters.

DoCmd.OpenForm "PlsWaitFrm", acWindowNormal
[Forms]![PlsWaitFrm].Repaint



'All of out criteria values are now selected.  We can move on to pulling data from the tables.
'We start by populating the IIPM table with the information that we require for applications.

strSQ1 = "DELETE * from [tbl-RPT-IIPM] "
db.Execute strSQ1

strSQ2 = "INSERT INTO [tbl-RPT-IIPM] " & _
         "SELECT * FROM [tbl-IIPM] " & _
         "WHERE (([AppCode] like '" & fullapp & "')" & _
         "AND ([AppCoordinator] like '" & coor & "') " & _
         "AND ([AppCustodian] like '" & cust & "') " & _
         "AND ([L3] like '" & appL3 & "') " & _
         "AND ([L4] like '" & appL4 & "') " & _
         "AND ([L5] like '" & appL5 & "')) "
db.Execute strSQ2

'MsgBox "made it past the populate of rpt-iipm"


'Now we have populated the IIPM report table, it's time to populate the event report table.
'We will loop through all fields in the IIPM report table and pull information for each
'application code.

strSQ3 = "DELETE * from [tbl-EVENTREPORT] "
db.Execute strSQ3

Dim rs As DAO.Recordset

Set db = CurrentDb
Set rs = db.OpenRecordset("tbl-RPT-IIPM") 'this opens the IIPM report table just populated

'populate the table
rs.MoveLast
rs.MoveFirst

Do While Not rs.EOF
'we will execute these action against the selected record.

'first step - parse the application code to display the full application code

appl = rs![AppCode].Value
length = Len(appl)
If length = 1 Then appl = "" & appl & "00"

rptdelin = Mid(appl, 3, 1)

rptcode = Mid(appl, 1, 3)
If rptdelin = "0" Then rptcode = Mid(appl, 1, 2)
If rptdelin = "R" Then rptcode = "RT" & Mid(appl, 1, 2) & ""

'MsgBox "searching for: " & rptcode & "."

applist = applist & "," & appl

strSQ4 = "INSERT INTO [tbl-EVENTREPORT] " & _
         "SELECT * FROM [tbl-EVENT DATA] " & _
         "WHERE (([ev-jobname] LIKE '?" & rptcode & "*') " & _
         "AND (([ev-ctr] = '" & ctrOCC & "')" & _
         "OR ([ev-ctr] = '" & ctrMTL & "')" & _
         "OR ([ev-ctr] = '" & ctrBCC & "')" & _
         "OR ([ev-ctr] = '" & ctrITS & "')" & _
         "OR ([ev-ctr] = '" & ctrDAIN & "'))" & _
         "AND (" & kinddate & ") " & _
         "AND " & evstatus & ")"

db.Execute strSQ4

 'now we're done with this report, we move on to the next

   rs.MoveNext             'press Ctrl+G to see debuG window beneath
Loop

'END OF LOOPING CODE

'MsgBox "made it past the looping"

'Now we have completed populating the table that the report will be based on.
'Next step is to gather master statistics to produce abend and success percentages.

totfail = DCount("[ev-status]", "tbl-EVENTREPORT", "[ev-status] = 'AEOJ'")
totsucc = DCount("[ev-status]", "tbl-EVENTREPORT", "[ev-status] = 'EOJ'")

Dim allabend As Long
Dim allsucc As Long

allabend = DCount("[ev-status]", "[tbl-EVENT DATA]", "[ev-status] = 'AEOJ' AND ([ev-date] >= " & Sdte & " AND [ev-date] <= " & Edte & ")")
allsucc = DCount("[ev-status]", "[tbl-EVENT DATA]", "[ev-status] = 'EOJ' AND ([ev-date] >= " & Sdte & " AND [ev-date] <= " & Edte & ")")

Dim pctabend As Long
Dim pctsucc As Long

pctabend = (totfail / allabend) * 100
pctsucc = (totsucc / allsucc) * 100

'Now we will generate the reports for display based on what type of report was selected
'by the user in the initial form.

'Before we open the report, we will close the splash screen
DoCmd.Close acForm, "PlsWaitFrm", acSaveNo

'Now we open the report

If [opt-criteria].Value = 1 Then

fullappnm = DLookup("AppName", "tbl-RPT-IIPM", "AppCode = '" & fullapp & "' ")
fullappcoor = DLookup("AppCoordinator", "tbl-RPT-IIPM", "AppCode = '" & fullapp & "' ")



DoCmd.OpenReport "rpt-APPLREPORT", acViewReport

[Reports]![rpt-APPLREPORT]![rpt-appcode].Value = fullapp
[Reports]![rpt-APPLREPORT]![rpt-appname].Value = fullappnm
[Reports]![rpt-APPLREPORT]![rpt-appcoor].Value = fullappcoor
[Reports]![rpt-APPLREPORT]![rpt-abendtot].Value = totfail
[Reports]![rpt-APPLREPORT]![rpt-succtot].Value = totsucc
[Reports]![rpt-APPLREPORT]![rpt-abdpct].Value = pctabend
[Reports]![rpt-APPLREPORT]![rpt-succpct].Value = pctsucc

End If

If [opt-criteria].Value = 2 Then

DoCmd.OpenReport "rpt-COORREPORT", acViewReport

[Reports]![rpt-COORREPORT]![rpt-appcode].Value = applist
[Reports]![rpt-COORREPORT]![rpt-appcoor].Value = coor
[Reports]![rpt-COORREPORT]![rpt-abendtot].Value = totfail
[Reports]![rpt-COORREPORT]![rpt-succtot].Value = totsucc
[Reports]![rpt-COORREPORT]![rpt-abdpct].Value = pctabend
[Reports]![rpt-COORREPORT]![rpt-succpct].Value = pctsucc

End If

If [opt-criteria].Value = 3 Then

DoCmd.OpenReport "rpt-CUSTREPORT", acViewReport

[Reports]![rpt-CUSTREPORT]![rpt-appcode].Value = applist
[Reports]![rpt-CUSTREPORT]![rpt-appcoor].Value = cust
[Reports]![rpt-CUSTREPORT]![rpt-abendtot].Value = totfail
[Reports]![rpt-CUSTREPORT]![rpt-succtot].Value = totsucc
[Reports]![rpt-CUSTREPORT]![rpt-abdpct].Value = pctabend
[Reports]![rpt-CUSTREPORT]![rpt-succpct].Value = pctsucc
End If

If [opt-criteria].Value = 4 Then

DoCmd.OpenReport "rpt-L3REPORT", acViewReport

[Reports]![rpt-L3REPORT]![rpt-appcode].Value = applist
[Reports]![rpt-L3REPORT]![rpt-appcoor].Value = appL3
[Reports]![rpt-L3REPORT]![rpt-abendtot].Value = totfail
[Reports]![rpt-L3REPORT]![rpt-succtot].Value = totsucc
[Reports]![rpt-L3REPORT]![rpt-abdpct].Value = pctabend
[Reports]![rpt-L3REPORT]![rpt-succpct].Value = pctsucc
End If


If [opt-criteria].Value = 5 Then

DoCmd.OpenReport "rpt-L4REPORT", acViewReport

[Reports]![rpt-L4REPORT]![rpt-appcode].Value = applist
[Reports]![rpt-L4REPORT]![rpt-appcoor].Value = appL4
[Reports]![rpt-L4REPORT]![rpt-abendtot].Value = totfail
[Reports]![rpt-L4REPORT]![rpt-succtot].Value = totsucc
[Reports]![rpt-L4REPORT]![rpt-abdpct].Value = pctabend
[Reports]![rpt-L4REPORT]![rpt-succpct].Value = pctsucc
End If

If [opt-criteria].Value = 6 Then

DoCmd.OpenReport "rpt-L5REPORT", acViewReport

[Reports]![rpt-L5REPORT]![rpt-appcode].Value = applist
[Reports]![rpt-L5REPORT]![rpt-appcoor].Value = appL5
[Reports]![rpt-L5REPORT]![rpt-abendtot].Value = totfail
[Reports]![rpt-L5REPORT]![rpt-succtot].Value = totsucc
[Reports]![rpt-L5REPORT]![rpt-abdpct].Value = pctabend
[Reports]![rpt-L5REPORT]![rpt-succpct].Value = pctsucc
End If



ErrorHandler:
If Err.Number = 7874 Then
Resume Next 'Tried to delete a non-existing table, resume
End If
End Sub
'''

Again, I very much appreciate any thoughts. 

-Gord


0
Gord 19 may. 2020 a las 15:30

3 respuestas

OK, con algo más de información, algunas respuestas más que pueden (¡o no!) Ayudar. Nuevamente, deberá ejecutar pruebas de tiempo para ver cuál funciona mejor para usted.

Intente agregar un campo "Sí / No" a la tabla [tbl-EVENT DATA]. Luego puede usar una instrucción UPDATE para indicar qué campos incluir en el informe, en lugar de usar la consulta lenta INSERT.

Otra cosa para intentar sería reemplazar la declaración INSERT con varias, cada una con un valor diferente para [ev-ctr]. O bien, en lugar de usar OR intente usar IN:

strSQ4 = "INSERT INTO [tbl-EVENTREPORT] " & _
         "SELECT * FROM [tbl-EVENT DATA] " & _
         "WHERE [ev-jobname] LIKE '?" & rptcode & "*' " & _
         "AND [ev-ctr] IN('" & ctrOCC & "','" & ctrMTL & "','" & ctrBCC & "','" & ctrITS & "','" & ctrDAIN & "')" & _
         "AND " & kinddate &  _
         "AND " & evstatus 

Además, noto que kinddate está configurado para incluir efectivamente todas las fechas en una instancia, y que evstatus está configurado para incluir tanto "EOJ" como "AEOJ" en una instancia. En lugar de incluir estos campos como criterios en estos casos, es posible que no desee incluirlos en absoluto:

If state = 1 Then
    evstatus = " AND [ev-status] = 'AEOJ'"
ElseIf state = 2 Then
    evstatus = " AND [ev-status] = 'EOJ'"
ElseIf state = 3 Then
    evstatus = " "
End If

Y luego volvería a escribir " AND " & evstatus en & evstatus en la instrucción SQL.

Una última cosa a tener en cuenta es ejecutar el INSERT directamente en el back-end, en lugar de operar en tablas vinculadas en la interfaz, ya que Access arrastrará grandes cantidades de datos a través de la red y luego los enviará de vuelta. Como guía básica, algo como esto:

Sub sUpdateQuery()
    Dim objAccess As New Access.Application
    objAccess.OpenCurrentDatabase "J:\downloads\test.accdb"
    objAccess.DoCmd.RunSQL "UPDATE test2 SET Field1=UCASE(Field1);"
    objAccess.CloseCurrentDatabase
    Set objAccess = Nothing
End Sub

Saludos

0
Applecore 20 may. 2020 a las 16:36

Applecore, en primer lugar, déjame agradecerte por tus ideas. Desafortunadamente, debido a la naturaleza de la forma en que se procesan los datos, algunos de ellos no estoy seguro de poder implementarlos. He utilizado las declaraciones de debug.print para tener una mejor idea del momento.

Tienes razón, la declaración INSERT me está causando la mayoría de los problemas, y solo la segunda. Las eliminaciones vuelan casi al instante, sin problemas. Es la segunda inserción de los datos del evento lo que lo está ralentizando.

He estado pensando en esto desde el inicio de cómo bromear más eficientemente y crear mejores relaciones, pero estoy bloqueado. Mi problema es que los datos entre la tabla de eventos y la tabla de eventos están relacionados "en el mundo" pero no de manera clara en términos de datos. No hay forma de determinar la relación sin un cálculo complejo. Por ejemplo, la parte única de los datos de la aplicación es el código de la aplicación. Siempre son únicos. Un solo coordinador de aplicaciones puede tener docenas de códigos asignados, al igual que los custodios, L3, L4, etc. Cada evento está relacionado con una aplicación, sin embargo, no se exporta ningún campo específico que indique el código de la aplicación, se obtiene analizando el nombre del evento (y sí, eso es tan arcaico como parece). Los estándares de denominación de eventos son nombres de caracteres de mainframe estándar 8:. Por ejemplo PGRD1234 - Trabajo de producción, aplicación GRD, 1234 como designador. Entonces, para determinar con qué aplicación está relacionado el trabajo, tomo el código de la aplicación y selecciono LIKE con comodines. No es 100% exacto, lo sé, pero al usar comodines, parece que estoy atascado usando LIKE. No he podido hacer que '=' funcione con comodines. ¿Puedes?

También mencionó "Cuando inserta datos en [tbl-EVENTREPORT], lo hace al recorrer un conjunto de registros; puede ser más rápido usar una instrucción INSERT SQL". lo cual no estoy seguro de lo que estás diciendo ... Mis disculpas. No creo que lo esté entendiendo. Creo que eso es lo que estoy haciendo ahora. Utilizo la tabla IIPM para obtener la lista de los códigos de aplicación que necesito extraer, luego recorro ese conjunto de registros para extraer todos los datos de eventos solo para esas aplicaciones. Como no existe una correlación directa entre los datos, no puedo pensar en otra forma de hacerlo.

0
Gord 20 may. 2020 a las 13:26

En primer lugar, debe averiguar dónde están los cuellos de botella, por lo que le sugiero que coloque algunas declaraciones Debug.Print Now en todo el código para darle una idea de lo que está causando el problema.

Supongo que dos de los procesos que toman la mayor parte del tiempo son las declaraciones DELETE / INSERT que estás haciendo.

Sugeriría que, en lugar de hacerlo, busque normalizar su base de datos y luego crear una consulta que proporcione la información que necesita.

Además, al ejecutar el informe directamente desde una consulta en lugar de una tabla temporal, significa que no tiene que preocuparse por las eliminaciones / inserciones que crean la hinchazón de la base de datos.

Si realmente insiste en mantener este proceso, considere eliminar la tabla [tbl-RPT-IIPM] y luego volver a crearla, en lugar de eliminar los registros. Y considere eliminar los índices antes de la inserción, y luego agregarlos nuevamente, ya que los índices reducen las inserciones, pero obviamente aceleran las búsquedas y las uniones.

Además, cuando está insertando datos en [tbl-RPT-IIPM], está utilizando ([L3] like '" & appL3 & "'), que es lo mismo que ([L3]='" & appL3 & "'), pero más lento.

Cuando inserta datos en [tbl-EVENTREPORT], lo hace al recorrer un conjunto de registros; puede ser más rápido usar una instrucción SQL INSERT.

Saludos

1
Applecore 19 may. 2020 a las 17:25