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

SQL Loader, насищане на задействане?

Вече сте на половината път до решението:

Това не е изненада. Вашето текущо внедряване изпълнява много оператори SELECT за един ред за всеки ред, който вмъквате в таблица B. Това неизбежно ще ви даде лош профил на производителност. SQL е базиран на набори език и се представя по-добре с многоредови операции.

И така, това, което трябва да направите, е да намерите начин да замените всички оператори SELECT с по-ефективни алтернативи. Тогава ще можете да премахнете тригерите за постоянно. Например, заменете справките в речника с външни ключове между колоните на таблицата A и референтната таблица. Ограниченията на релационния интегритет, тъй като са вътрешен код на Oracle, се представят много по-добре от всеки код, който можем да напишем (и също да работим в среди с много потребители).

Правилото за невмъкване в таблица A, ако комбинация от колони вече съществува в таблица B, е по-проблематично. Не защото е трудно да се направи, а защото звучи като лош релационен дизайн. Ако не искате да зареждате записи в таблица A, когато те вече излизат в таблица B, защо не зареждате директно в таблица B? Или може би имате поднабор от колони, които трябва да бъдат извлечени от таблица A и таблица B и оформена в таблица C (която би имала външни ключови връзки с A и B)?

Както и да е, оставяйки това настрана, можете да направите това с базиран на набор SQL, като замените SQL*Loader с външна таблица. Външна таблица ни позволява да представим CSV файл в базата данни, сякаш е обикновена таблица. Това означава, че можем да го използваме в нормални SQL изрази. Научете повече.

И така, с ограничения на външен ключ за речник и външна таблица, можете да замените кода на SQL Loader с този оператор (предмет на всички други правила, включени в „...и така нататък“):

insert into table_a
select ext.* 
from external_table ext
     left outer join table_b b
     on (ext.name = b.name and ext.last_name = b.last_name and ext.dept=b.dept)
where b.name is null
log errors into err_table_a ('load_fail') ;

Това използва синтаксиса за регистриране на грешки в DML, за да улови грешките на ограниченията за всички редове по начин, базиран на набор. Научете повече . Няма да предизвика изключения за редове, които вече съществуват в таблица B. Можете да използвате или множествената таблица INSERT ALL за насочване на редове към таблица с препълване или използване на операция MINUS set след събитието, за да намерите редове във външната таблица, които не са в таблица A. Зависи от вашата крайна цел и как трябва да докладвате нещата.

Може би по-сложен отговор, отколкото сте очаквали. Oracle SQL е много обширна SQL реализация с много функционалност за подобряване на ефективността на масовите операции. Наистина ни се струва да прочетем Ръководството за концепции и Справочника за SQL, за да разберем колко много можем да направим с Oracle.




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

  2. dbms_output препълване на буфер с размер

  3. Мога ли да деактивирам тригер вътре в тригер в oracle?

  4. EM12c вече позволява DB12c за репозитории

  5. Как да декларирам числова променлива, където мога да запазя броя на таблицата в моя цикъл