09. januar 2006 - 15:48Der 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.
Cybersikkerhed, realtidsdata og robuste it-systemer er blevet fundamentet for moderne forsvar.
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?
Synes godt om
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
Synes godt om
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
Synes godt om
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.
Synes godt om
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
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
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 t As Integer For t = 1 To 6 param.Value = "Dummy_" & t objCommand.Execute Next
MsgBox (DateDiff("s", a, Now))
Synes godt om
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.-
Synes godt om
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.
Synes godt om
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.
Synes godt om
Slettet bruger
09. juni 2006 - 07:07#11
svar
Synes godt om
Slettet bruger
09. juni 2006 - 07:54#12
.
Synes godt om
Ny brugerNybegynder
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.