Multi-Row-Insert Oracle 12c



  • Hi, ich möchte aus Performancegründen mehrere ca. 100 Valuesets auf einmal in die Db schreiben. Z. B. so

    INSERT INTO tbl_name
        (a,b,c)
    VALUES
        (1,2,3),
        (4,5,6),
        (7,8,9);
    

    Unter MySQL kein Problem, aber unter Oracle habe ich noch keine analoge Syntax für finden können die auch funktioniert. Das "INSERT ALL INTO" zählt leider unter Oracle den Primary Key nicht hoch. Wie macht man das also unter Oracle 12c am besten?

    INSERT ALL
      INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
      INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
      INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
    SELECT * FROM dual;
    


  • Ich kenn mich leider mit Oracle nicht aus, aber ich kann dir ein paar Sachen sagen die du probieren könntest.

    1. INSERT ALL mit expliziter NULL für die Key-Spalte. Bei manchen Datenbanken funktioniert sowas.
    2. Explizite Transaktion rund um die einzelnen INSERT mit einem einzigen COMMIT am Schluss.
    3. UNION ALL
      Ala
    INSERT INTO tbl_name (a,b,c)
              SELECT 1, 2, 3
    UNION ALL SELECT 4, 5, 6
    UNION ALL SELECT 7, 8, 9;
    
    1. Manche DBs haben Funktionen mit denen man sich explizit den nächsten Wert für ne Autoinkrement Spalte einer bestimmten Tabelle holen kann.
    2. Oder gibt es vielleicht Funktionen mittels derer man Rowsets aus Strings erzeugen kann? MSSQL kann z.B. XML parsen und ein Rowset zurückgeben das man dann in SELECT verwenden kann. Das kann man dann in einem INSERT ... SELECT verwenden. Dazu muss man natürlich vorher die Daten erstmal in XML verwandeln, aber von der Performance her ist es bei MSSQL deutlich besser als einzelne INSERTs.
    3. Table Variablen. Auch keine Ahnung ob Qracle sowas kann, aber es gibt DBs die in-memory Table-Variablen können - wie z.B. auch MSSQL. Falls es sowas gibt wäre es möglich dass lauter einzelne INSERTs in ne Table-Variable schneller sind als direkt in den Table. In dem Fall dann die Zeilen erst einzeln in die Table-Variable einfügen und dann wieder mit INSERT ... SELECT weiter in die Tabelle schieben.
    4. Wenn das alles nix hilft, dann bleibt noch die Möglichkeit in nen Temp-Table mit INSERT ALL einzufügen, und dann von dort weiter mit INSERT ... SELECT in die permanente Tabelle.