Oracle
 sql >> база данни >  >> RDS >> Oracle

INSERT от 10 милиона заявки под 10 минути в Oracle?

Знам, че други споменаха това и вие не искате да го чуете, но използвайте SQL*Loader или външни таблици. Средното ми време за зареждане за таблици с приблизително еднаква ширина е 12,57 секунди за малко над 10 м реда. Тези помощни програми са изрично проектирани да зареждат бързо данни в базата данни и са доста добри в това. Това може да доведе до някои допълнителни времеви санкции в зависимост от формата на вашия входен файл, но има доста опции и рядко ми се е налагало да променям файловете преди зареждане.

Ако не желаете да направите това, тогава все още не е нужно да надграждате хардуера си; трябва да премахнете всички възможни пречки за бързото зареждане. За да ги изброите, премахнете:

  1. Индексът
  2. Задействането
  3. Последователността
  4. Дялът

С всичко това вие задължавате базата данни да извършва повече работа и тъй като правите това транзакционно, вие не използвате базата данни в пълния й потенциал.

Заредете данните в отделна таблица, кажете ABC_LOAD . След като данните са напълно заредени, извършете единично INSERT израз в ABC.

insert into abc
select abc_seq.nextval, a.*
  from abc_load a

Когато направите това (и дори да не го направите), уверете се, че размерът на кеша на последователността е правилен; да цитирам:

Когато приложение осъществи достъп до последователност в кеша на последователността, тези последователни номера се четат бързо. Ако обаче приложение осъществи достъп до последователност, която не е в кеша, тогава последователността трябва да бъде прочетена от диска в кеша, преди да се използват последователните номера.

Ако вашите приложения използват много последователности едновременно, тогава кешът на вашите последователности може да не е достатъчно голям, за да побере всички последователности. В този случай достъпът до последователни номера често може да изисква четене на диск. За бърз достъп до всички последователности се уверете, че кешът ви има достатъчно записи, за да съхранява всички последователности, използвани едновременно от вашите приложения.

Това означава, че ако имате 10 нишки, които едновременно записват по 500 записа, всеки използващ тази последователност, тогава ви е необходим размер на кеша от 5000. Документът ALTER SEQUENCE посочва как да промените това:

alter sequence abc_seq cache 5000

Ако следвате моето предложение, бих увеличил размера на кеша до около 10,5 m.

Разгледайте използването на съвета APPEND (вижте също Oracle Base); това инструктира Oracle да използва вмъкване с директен път, което добавя данни директно в края на таблицата, вместо да търси място, за да ги постави. Няма да можете да използвате това, ако таблицата ви има индекси, но можете да го използвате в ABC_LOAD

insert /*+ append */ into ABC (SSM_ID, invocation_id , calc_id, ... )
select 'c','b',NULL, 'test', 123 , 'N', 'asdf' from dual
union all select 'a','b',NULL, 'test', 123 , 'N', 'asdf' from dual
union all select 'b','b',NULL, 'test', 123 , 'N', 'asdf' from dual
union all select 'c','g',NULL, 'test', 123 , 'N', 'asdf' from dual

Ако използвате съвета APPEND; Бих добавил TRUNCATE ABC_LOAD след като сте вмъкнали в ABC в противен случай тази таблица ще расте за неопределено време. Това трябва да е безопасно, тъй като дотогава ще сте приключили с използването на таблицата.

Не споменавате коя версия, издание или Oracle използвате. Има редица допълнителни малки трикове, които можете да използвате:

  • Oracle 12c

    Тази версия поддържа колони за идентичност; можете напълно да се отървете от последователността.

    CREATE TABLE ABC(
       seq_no         NUMBER GENERATED AS IDENTITY (increment by 5000)
    
  • Oracle 11g r2

    Ако задържите спусъка; можете да присвоите стойността на последователността директно.

    :new.seq_no := ABC_seq.nextval;
    
  • Oracle Enterprise Edition

    Ако използвате Oracle Enterprise, можете да ускорите INSERT от ABC_LOAD с помощта на ПАРАЛЕЛЕН намек:

    insert /*+ parallel */ into abc
    select abc_seq.nextval, a.*
      from abc_load a
    

    Това може да причини собствени проблеми (твърде много паралелни процеси и т.н.), така че тествайте. Може помощ за по-малките партиди вмъквания, но е по-малко вероятно, тъй като ще загубите време да изчислявате коя нишка какво трябва да обработи.

tl;dr

Използвайте помощните програми, които идват с базата данни.

Ако не можете да ги използвате, тогава се отървете от всичко, което може да забави вмъкването, и го направете на едро, защото базата данни е добра в това.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. списък на данните в използваем формат?

  2. EF 4, как да добавя частични класове

  3. Oracle:OALL8 е в непоследователно състояние

  4. Как да създадете временна таблица в база данни на Oracle?

  5. Получаване на изход от dbms_output.get_lines с помощта на JDBC