Avatar billede Slettet bruger
09. januar 2006 - 15:48 Der er 10 kommentarer og
2 løsninger

Access performance

Hej,

Jeg ønsker at få bedre performance (læs: hurtigere eksekvering af forespørgsler) i access.

Jeg arbejder på excel platform i Vb over en intranetforbindelse på 10mbit (eller noget i den stil).

Er der nogen indstillinger, jeg kan lave, så forespørgsler er hurtigere:
-Undlade at tage backup (databasen bliver ikke mindre, hvis jeg sletter data - først når jeg komprimerer, bliver størrelsen mindre)
-Tracing (hvilke brugere og queries, der er kørt) - hvis der er sådan noget, skal det bare disables

Lige nu kører jeg med ADODB.Recordset:
set RS = new ADODB.Recordset
rs.open sql, strconnect

Er der ikke et hurtigere object, jeg kan bruge, hvor jeg i starten opretter conn to databasen som jeg bibeholder gennem hele macroen og først til sidst closer (lidt som i ASP, hvor man opretter et db object f.eks 'conn' og eksekverer queries med dette - conn.execute(sql)).

Desuden er jeg også interesseret i en workaroung hvor man kan lave flere inserts, updates på en gang - jeg har et sted læst om at bruge UNION ALL på nogen lunde denne måde, men tror ikke, jeg havde success med det:
INSERT INTO [tbl] ([row]) (SELECT 'val_1' FROM [dummy_tbl])
UNION ALL
INSERT INTO [tbl] ([row]) (SELECT 'val_2' FROM [dummy_tbl])

Jeg er også interesseret i andre løsninger, hvis i har erfaring på dette område.

Vh Mathias.
Avatar billede Slettet bruger
09. januar 2006 - 21:36 #1
Hvis du gerne vil genbruge din forbindelse laver du en ADODB.Connection og definerer dine kommandoer med ADODB.Command. Der er noget ADO reference her http://www.w3schools.com/ado/ado_ref_command.asp

Der er ikke noget umiddelbart hurtigerer end ADO på den givne platform.

Ikke sikker på jeg forstår hvor du vil hen med dine inserts, men hvis du skal lave mange inserts i et loop så check igen ADO referencen for at lave Command-objekter med parametre.

Hvor står er den fil, som indeholder din Access database og hvor komplekse er de forespørgsler du forsøger at lave?
Avatar billede Slettet bruger
10. januar 2006 - 08:20 #2
Databasen kan komprimeres til omkring 3-4 MB på givne tidspunkt.. jeg regner med den snart bliver noget større. Jeg skal køre JOINs med 10-15 tabeller.

Jeg vil da sige, det hjælper at lave en conn først.. test_1 alerter 6 mens test_2 alerter 14. Hvis conn er defineret, tager det alså halvdelen af tiden at lave en simpel insert. Jeg har ikke fået kikket på dit link endnu med command-objectet, men kikkede hurtigt igennem ADO tutorialen.. jeg kikker mere på hele siden og skriver min erfaring her - flere optimeringsforslag er velkomne :o).

Sub test_1()
    Dim conn As ADODB.Connection
    Set conn = New ADODB.Connection
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    conn.Provider = "Microsoft.Jet.OLEDB.4.0"
    conn.Open ActiveWorkbook.BuiltinDocumentProperties.Item(6) & "TCC_Test_requests_System_Testing.mdb"
   
    Dim a As Date
    a = Now
    rs.Open "Insert into [testing] (product) Values ('Dummy')", conn
    rs.Open "Insert into [testing] (product) Values ('Dummy')", conn
    rs.Open "Insert into [testing] (product) Values ('Dummy')", conn
    rs.Open "Insert into [testing] (product) Values ('Dummy')", conn
    rs.Open "Insert into [testing] (product) Values ('Dummy')", conn
    rs.Open "Insert into [testing] (product) Values ('Dummy')", conn
    MsgBox (DateDiff("s", a, Now))
End Sub

Sub test_2()
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    Strconnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & ActiveWorkbook.BuiltinDocumentProperties.Item(6) & "TCC_Test_requests_System_Testing.mdb;"
   
    Dim a As Date
    a = Now
    rs.Open "Insert into [testing] (product) Values ('Dummy')", Strconnect
    rs.Open "Insert into [testing] (product) Values ('Dummy')", Strconnect
    rs.Open "Insert into [testing] (product) Values ('Dummy')", Strconnect
    rs.Open "Insert into [testing] (product) Values ('Dummy')", Strconnect
    rs.Open "Insert into [testing] (product) Values ('Dummy')", Strconnect
    rs.Open "Insert into [testing] (product) Values ('Dummy')", Strconnect
    MsgBox (DateDiff("s", a, Now))
End Sub
Avatar billede Slettet bruger
10. januar 2006 - 08:54 #3
Jeg kan ikke helt gennemskue, hvad command objectet er til for? er dets
funktionalitet ikke dækket under recordset og connection?

Du skriver: "Ikke sikker på jeg forstår hvor du vil hen med dine inserts, men hvis du skal lave mange inserts i et loop så check igen ADO referencen for at lave Command-objekter med parametre."

betyder det noget i retning af dette, hvor der er muligt at lave flere queries i en execution:

objcommand.text = "insert into [testing] ([product]) Values ('Dummy')"
objcommand.text = "insert into [testing] ([product]) Values ('Dummy')"
objcommand.text = "insert into [testing] ([product]) Values ('Dummy')"
objcommand.text = "insert into [testing] ([product]) Values ('Dummy')"
objcommand.text = "insert into [testing] ([product]) Values ('Dummy')"
comobjcommandmand.execute
Avatar billede Slettet bruger
10. januar 2006 - 09:04 #4
Hvis du skal lave mange inserts så skal du lave et command objekt med parametre og det ser cirka ud som følger (du må selv lige klare præcis syntax)

objcommand.text = "insert into [testing] ([product]) Values (@parameter)"

set param = CreateParameter(@parameter,....)
objcommand.Parameters.Add(param)

på den måde kan du blot ændre værdien af parameteren og genbruge forbindelsen og dermed køre det hurtigere.
Avatar billede Slettet bruger
10. januar 2006 - 09:48 #5
Jeg har prøvet med dette, men den giver denne fejl:

'Parameter object is improperly defined. Inconsistent or incomplete information was provided'

Add virkede ikke, så jeg har i stedet brugt Append. Hvad har jeg gjort galt?

Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
conn.Provider = "Microsoft.Jet.OLEDB.4.0"
conn.Open ActiveWorkbook.BuiltinDocumentProperties.Item(6) & "TCC_Test_requests_System_Testing.mdb"

Dim objCommand As ADODB.Command
Set objCommand = New ADODB.Command

Dim a As Date
a = Now

objCommand.CommandText = "insert into [testing] ([product]) Values (@parameter)"
Set param = objCommand.CreateParameter
param.name = "@parameter"
param.Type = adVarChar

Dim t As Integer
For t = 1 To 6
    param.Value = "Dummy_" & t
    objCommand.Parameters.Append (param) <- Her er fejlen
Next

objCommand.ActiveConnection = conn
objCommand.Execute

MsgBox (DateDiff("s", a, Now))

Vh Mathias.
Avatar billede Slettet bruger
10. januar 2006 - 09:58 #6
prøv lige at checke hvad parametre skal hedde i Access er ikke sikker på de starter med @, men kender ikke Access godt nok til at vide hvad det er men check her for eksempler

http://support.microsoft.com/kb/181782/EN-US/
http://support.microsoft.com/default.aspx/kb/181716
Avatar billede Slettet bruger
10. januar 2006 - 10:23 #7
Du har ret - der skal ikke bruges @.. jeg kan stadig kun udføre en insert af gangen - kan man ikke på en måde indsætte et array i param eller noget i den stil? Jeg kan forestille, man vinder noget ved komplicerede queries, da access allerede har bearbejded querien, men jeg tror ikke, der er så meget at vinde i en masse små inserts.


    Dim conn As ADODB.Connection
    Set conn = New ADODB.Connection
    conn.Provider = "Microsoft.Jet.OLEDB.4.0"
    conn.Open ActiveWorkbook.BuiltinDocumentProperties.Item(6) & "TCC_Test_requests_System_Testing.mdb"
   
    Dim objCommand As ADODB.Command
    Set objCommand = New ADODB.Command
   
    Dim a As Date
    a = Now
   
    objCommand.CommandText = "insert into [testing] ([product]) Values (product)"
    Set param = objCommand.CreateParameter
    param.name = "product"
    param.Type = adVarChar
    param.Size = 255
    objCommand.ActiveConnection = conn
    objCommand.Parameters.Append (param)
   
    Dim t As Integer
    For t = 1 To 6
        param.Value = "Dummy_" & t
        objCommand.Execute
    Next
   
    MsgBox (DateDiff("s", a, Now))
Avatar billede Slettet bruger
10. januar 2006 - 10:28 #8
Du kan ikke lave flere på en gang. Det er sådan som ovenfor det skal gøres.

Eneste mulighed er at danne et SQL batch (lave en tekst string med en masse inserts) og afvikle det, men det er ikke hurtigere end ovenstående, tværimod. Problemet er at Access skal parse batchet og så lave fysiske inserts ud af det hvorimod du med ovenstående har insert kommandoen klar.

Så gøre som ovenfor det et meningen at det skal bruges sådan.-
Avatar billede Slettet bruger
10. januar 2006 - 10:44 #9
:'(..

Men tak for dit link til brugen af connection objectet..

Jeg vil lade spm. stå åbent for flere ideer til forbedringer.

Vh Mathias.
Avatar billede Slettet bruger
08. juni 2006 - 17:39 #10
Da der ikke er kommet flere løsninger, lukker jeg..

Smid et svar, og du vil få nogle points.
Avatar billede Slettet bruger
09. juni 2006 - 07:07 #11
svar
Avatar billede Slettet bruger
09. juni 2006 - 07:54 #12
.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester