Avatar billede hacked Nybegynder
06. oktober 2006 - 16:46 Der er 12 kommentarer og
2 løsninger

Indsæt 15000 records i Oracle DB

Hvordan gør man dette hurtigst? Jeg har prøvet at oprette en procedure i databasen og kalde den fra c# men det går lige så langsomt som hvis jeg blot kalder indsæt i c# koden mange gange.
Jeg har et array af typen OracleDate som jeg sender med som parameter.

Yderligere - Jeg har problemer med at sende et array og en int værdi med som parametre samtidig. Når jeg eksekvere får jeg en exception der fortæller at int værdien ikke er et array. Kan man ikke sende to forskellige parametre med samtidig? altså et array og fx. en int? Har det noget at gøre med at jeg sætte oracleCommand.ArrayBindCount til at være størrelsen på mit Array?
Avatar billede arne_v Ekspert
06. oktober 2006 - 17:41 #1
Har du proevet at bundle alle INSERT's i en enkelt transaktion ?
Avatar billede hacked Nybegynder
06. oktober 2006 - 19:05 #2
Nej - Kan du give et eksempel?
Avatar billede arne_v Ekspert
06. oktober 2006 - 19:13 #3
du kalder BeginTransaction paa dit Connection objekt, gemmer transaktionen, laver dine
INSERT's og kalder saa Commit paa transaktionen

jeg kan godt lave et eksempel senere, men det er lige ud af landevejen
Avatar billede hacked Nybegynder
06. oktober 2006 - 21:22 #4
Ah - ok. Jeg fandt lige ud af at proceduren i databasen faktisk var klart hurtigere :) Jeg havde fokuseret lidt for meget på sekunderne og havde glemt at tage minutter med. Der var nemlig kun 5 sekunders forskel i nogle af tidstagninger (+1 min =) ).

Seneste tidstagning:
SQL i kode  : 00:01:45.2812500
Procedure DB: 00:00:27.7343750

Prøver din metode lige om lidt.
Har dog stadig et problem hvad angår at sende et array og en int med som parametre til min procedure.
Min kode ser således ud:

OracleCommand oracleCommand = conn.CreateCommand();
            oracleCommand.CommandText = "Test_ArrayBind";
            oracleCommand.CommandType = CommandType.StoredProcedure;
            OracleDate[] oracleDateArray = oracleDateList.ToArray();
            oracleCommand.ArrayBindCount = oracleDateArray.Length;
            OracleParameter dateParam = new OracleParameter("holiday", OracleDbType.Date);
            dateParam.Direction = ParameterDirection.Input;
            dateParam.Value = oracleDateArray;
            oracleCommand.Parameters.Add(dateParam);
            OracleParameter calendarIDParam = new OracleParameter("calendarID", OracleDbType.Int32);
            calendarIDParam.Direction = ParameterDirection.Input;
            calendarIDParam.Value = calendarID;
            oracleCommand.Parameters.Add(calendarIDParam);
            oracleCommand.ExecuteNonQuery();

Her får jeg en {"Unable to cast object of type 'System.Int32' to type 'System.Array'."} .
Hvis prøver at fjerne oracleCommand.ArrayBindCount får jeg en {"Unable to cast object of type 'Oracle.DataAccess.Types.OracleDate[]' to type 'System.IConvertible'."}

Er der ikke en løsning?
Avatar billede hacked Nybegynder
07. oktober 2006 - 00:14 #5
Jeg har lige fundet ud af, at det ikke kan lade sig gøre. Såfremt man sender et eller flere arrays med som parametre skal alle parametre være arrays samt have samme størrelse.
Avatar billede hacked Nybegynder
07. oktober 2006 - 01:35 #6
Oprettede et array af int. Skrev en forløkke og lagde herefter int-værdien ned i samtlige pladser i arrayet.
Læg et svar så deler vi i porten.
Avatar billede arne_v Ekspert
07. oktober 2006 - 04:12 #7
Jeg havde et SQLServer test program som jeg nemt kunne portere til Oracle.

CREATE TABLE testtable (id INTEGER PRIMARY KEY, val VARCHAR2(50))

15000 INSERT

resultater (alle testet gentaget 3 gange):

String no reuse command object multiple transactions 20015 ms
String reuse command object multiple transactions 18937 ms
String no reuse command object one transaction 9812 ms
String reuse command object one transaction 9765 ms
Parameters no reuse command object multiple transactions 14453 ms
Parameters reuse command object multiple transactions 14203 ms
Parameters no reuse command object one transaction 5390 ms
Parameters reuse command object one transaction 5281 ms
Stored Procedure no reuse command object multiple transactions 17125 ms
Stored Procedure reuse command object multiple transactions 17156 ms
Stored Procedure no reuse command object one transaction 7937 ms
Stored Procedure reuse command object one transaction 7843 ms
String no reuse command object multiple transactions 18843 ms
String reuse command object multiple transactions 20765 ms
String no reuse command object one transaction 10078 ms
String reuse command object one transaction 9812 ms
Parameters no reuse command object multiple transactions 14484 ms
Parameters reuse command object multiple transactions 14281 ms
Parameters no reuse command object one transaction 5562 ms
Parameters reuse command object one transaction 5250 ms
Stored Procedure no reuse command object multiple transactions 17109 ms
Stored Procedure reuse command object multiple transactions 16906 ms
Stored Procedure no reuse command object one transaction 7921 ms
Stored Procedure reuse command object one transaction 7828 ms
String no reuse command object multiple transactions 18796 ms
String reuse command object multiple transactions 18734 ms
String no reuse command object one transaction 9890 ms
String reuse command object one transaction 10078 ms
Parameters no reuse command object multiple transactions 14437 ms
Parameters reuse command object multiple transactions 14359 ms
Parameters no reuse command object one transaction 5390 ms
Parameters reuse command object one transaction 5234 ms
Stored Procedure no reuse command object multiple transactions 17109 ms
Stored Procedure reuse command object multiple transactions 16921 ms
Stored Procedure no reuse command object one transaction 7906 ms
Stored Procedure reuse command object one transaction 7812 ms

og et svar
Avatar billede hacked Nybegynder
08. oktober 2006 - 00:58 #8
Dine inserts går jo klart hurtigere :) Må se lidt nærmere på det. Takker for info.
Avatar billede arne_v Ekspert
08. oktober 2006 - 01:12 #9
pointen var mest de relative forhold

de absolutte tal afhænger af recordens størrelse og af disk systemet
Avatar billede hacked Nybegynder
08. oktober 2006 - 01:39 #10
Du skulle vel aldrig kende en god bog eller nogle links hvor man kan læse mere?
Avatar billede hacked Nybegynder
08. oktober 2006 - 01:55 #11
Noget der omhandler database eller .net performance issues.
Avatar billede arne_v Ekspert
08. oktober 2006 - 02:28 #12
Jeg kender faktisk ikke nogle gode referencer.

To vigtige teknikker er:

* test

* tænke: hvis jeg nu skulle kode den her database server hvad ville så være hurtigst
Avatar billede md_craig Nybegynder
13. oktober 2006 - 14:40 #13
30.000 som tilsyneladende er det højeste opnået er jo stadig lidt sløvt hvis det er "rå dataimport"... desvære ved jeg ikke super meget om Oracle, men hvis der er en måde der ligner BulkCopy som tilsvarende i SQL Server, så skulle der være noget bedre performance... har selv med en SQL server været oppe og importere omkring 150.000 records i sekunden på den måde... (dvs. dit vil tage ca. 1 sek) og det er med at Læse data fra en Csv fil.. (Dvs der i det jeg har lavet er tilført en disk IO tid)
Avatar billede md_craig Nybegynder
13. oktober 2006 - 14:51 #14
det var 30.000/sek jeg mente ;)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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