06. oktober 2006 - 16:46Der 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?
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:
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'."}
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.
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
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)
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.