SQL WORLD
w poprzednim artykule podałem pomysł jak zaktualizować rekordy w sql. W tym artykule chciałbym przedstawić szczegółowe informacje na temat sposobu aktualizacji większości rekordów w bazie danych Oracle z wieloma przykładami.Chciałbym podać przykłady aktualizacji większości rekordów w oracle one one table o nazwie Customer i innych table o nazwie Company.
jakie są różne sposoby aktualizacji dużej ilości rekordów w bazie danych oracle?
istnieją różne metody, których używamy do aktualizacji większości rekordów w bazie danych oracle. Chciałbym szczegółowo omówić następujące sposoby z rzeczywistymi przykładami branżowymi. Te przykłady dadzą ci jasny obraz procesu aktualizacji oracle w szczegółach.
założenia:
Zakładamy, że istnieją dwie tabele – informacje o Kliencie – czyli nazwa klienta odwiedzającego określoną witrynę e-commerce. W tabeli klienta są miliony rekordów, ale zakładamy, że w tabeli klienta jest 999999 rekordów. Istnieje inna tabela o nazwie Customer_Entry, która ma również 777777 rekordów. Klucz podstawowy o nazwie Customer_ID znajduje się w obu tabelach.
rodzaje aktualizacji:
1.Aktualizacja za pomocą pętli For
2.Aktualizacja tradycyjna (aktualizacja rekordów indywidualnie)
3.Bulk update using BULK COLLECT and for ALL statement
4.Bezpośrednia aktualizacja SQL
5.Scal polecenie do rekordu aktualizacji szybko
6.Aktualizuj za pomocą metody widoku wbudowanego.
musimy wykonać wszystkie sposoby i sprawdzić wydajność e różnych instrukcji aktualizacji.
scenariusz 1 : Tradycyjny sposób aktualizacji poszczególnych rekordów i zatwierdzania po pętli for
begin
for cusrsor_1 in (select * from customer)
loop
update customer_entry
set
customer_no = cursor_1.customer_no, customer_name=cursor_1.customer_name, customer_product=C.customer_product where
customer_id= C.customer_id;
end loop; commit;
end;
/procedura PL/SQL została pomyślnie zakończona.
Czas trwania: 00:02: 42.36
Jeśli możesz sprawdzić pierwszy przykład, w którym próbujemy zaktualizować wszystkie rekordy za pomocą pętli for, a następnie użyć polecenia commit. Jeśli możesz wykonać określony blok PL SQL. Zakończenie procedury i aktualizacja zapisów zajmuje około 2 minut i 42 sekund.
Scenariusz 2 : tradycyjny sposób aktualizacji poszczególnych rekordów i zatwierdzania wewnątrz pętli for
begin
for cusrsor_1 in (select * from customer)
loop
update customer_entry
set
customer_no = cursor_1.customer_no, customer_name=cursor_1.customer_name, customer_product=C.customer_product where
customer_id= C.customer_id;
commit;
end loop;
end;
/procedura PL/SQL została pomyślnie zakończona.
upłynął: 00:03:58.39
Jeśli możemy sprawdzić proces i czas wykonania rekordów lub aktualizacji rekordów w bazie danych to około 3 minuty i 58 sekund. Pętla here uruchomi instrukcję commit po każdej aktualizacji rekordu, więc czas aktualizacji rekordu jest wyższy niż pojedynczy rekord commit.
Scenariusz 3 : Aktualizacja zbiorcza za pomocą zbiorczego zbierania i dla wszystkich
declare
type customer_t jest tabelą indeksu customer%rowtype według
pls_integer; l_customer_data customer_t;
begin select *
zbiorcze zbieranie do l_customer_data od klienta;
forall REC w 1 .. l_customer_data.count
update customer_entry e set e.customer_no= l_customer_data(rec).customer_no,
e.customer_name= l_employee_data(rec).customer_name,
e.customer_product= l_employee_data(rec).customer_product
where r.customer_id= l_employee_data(rec).customer_id;
commit;
end;
procedura PL/SQL została pomyślnie zakończona.
Czas trwania: 00:00:53.55
metoda zbierania zbiorczego jest szybsza od metody tradycyjnej. Wymagamy utworzenia zmiennej typu, w której możemy pobrać wszystkie dane Klienta i musimy użyć instrukcji zbiorczego zbierania w klauzuli forall, aby rekordy w klauzuli forall lub określonej tabeli zostały poprawnie zaktualizowane. Jeśli widzimy upływający czas, to jest to około 54 sekund, co jest szybsze niż inne metody.
4. Bezpośrednia aktualizacja SQL
begin
update customer_entry ent
set (customer_no, customer_name, customer_product) =
(select customer_no, customer_name, customer_product from customer C where C.customer_id= ent.customer_id)
where C. customer_id in (select customer_id from customer);
commit;
end;
procedura PL / SQL została pomyślnie zakończona.
Czas trwania: 00:00: 58.22
bezpośrednia aktualizacja zajmie 58 sekund, aby zaktualizować wszystkie rekordy. jeśli porównamy to z zbiorczym zbiorem, aktualizacja wszystkich rekordów zajęła 3-4 sekundy.
Scenariusz 5 : merge STATEMENT – najszybszy sposób na aktualizację większości rekordów
begin
Scal do customer_entry er używając
customer c
on (er.customer_id= C.customer_id)
po dopasowaniu
update set er.customer_number= c.customer_number,
er.cutomer_name= c. customer_name,
er.customer_product= c. customer_product;
commit;
end;
procedura PL/SQL została pomyślnie zakończona.
Update: 00:00:36.23
najszybszym sposobem aktualizacji większości rekordów jest użycie instrukcji Merge. Polecenie merge zajęło 36 sekund, aby szybko zaktualizować rekordy.
Scenariusz 6 :Aktualizacja przy użyciu metody widoku wbudowanego
begin
update
(
select r.customer_id, r.customer_number, r.customer_name, r.customer_product,
e.customer_number cnum, e.customer_name CNAME, e.customer_product cprod
from customer_entry r, customer e
where r.customer_id= e.customer_id
) 9
set customer_number = cnum
customer_name= cname,
customer_product= cprod;
commit;
End;
procedura PL/SQL została pomyślnie zakończona.
upłynął: 00:00:37.97
przy użyciu metody inline view bulk update zakończy się w przybliżeniu w 38 sekund, co jest również szybkim sposobem, takim jak polecenie Merge.
czego się uczymy?
myślenie każdego programisty SQL lub PLSQL jest zbiorcze i dla wszystkich instrukcja jest lepsza do wykonywania operacji zbiorczych. Jeśli możemy zaobserwować szczegóły w powyższych 6 zapytaniach, instrukcja Update SQL dałaby lepszą wydajność niż Bulk collect i dla wszystkich. Więc spróbuj użyć kodu SQL w PL / SQL API do szybkiej aktualizacji. Ale to będzie się różnić scenariusz do scenariusza, więc zawsze można sprawdzić scenariusze. Jeśli chcesz uzyskać najszybszą wydajność, spróbuj napisać polecenie merge lub widok Inline.
Leave a Reply