gdy podzapytanie zwraca dużą liczbę wierszy w porównaniu do liczby wierszy w Tabela 1, optymalizator będzie prawdopodobnie stworzenie planu tak:
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time
--------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 300K| 24M| | 1581 (1)| 00:0
| 1 | UPDATE | TABLE1 | | | | |
|* 2 | HASH JOIN SEMI | | 300K| 24M| 9384K| 1581 (1)| 00:0
| 3 | TABLE ACCESS FULL| TABLE1 | 300K| 5860K| | 355 (2)| 00:0
| 4 | TABLE ACCESS FULL| TABLE2 | 168K| 10M| | 144 (2)| 00:0
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("COL2"="COL2")
będzie skanować obie tabele raz i aktualizować tylko wiersze w TABELA1 wspólny dla obu tabel. Jest to bardzo wydajny plan, jeśli trzeba zaktualizować wiele wierszy.
Czasami zapytanie wewnętrzne będzie miało kilka wierszy w porównaniu do liczby wierszy w TABELA1. Jeśli indeks na TABLE1(col2)
, można wtedy uzyskać plan podobny do tego:
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 93 | 4557 | 247 (1)| 00:00:03 |
| 1 | UPDATE | TABLE1 | | | | |
| 2 | NESTED LOOPS | | 93 | 4557 | 247 (1)| 00:00:03 |
| 3 | SORT UNIQUE | | 51 | 1326 | 142 (0)| 00:00:02 |
| 4 | TABLE ACCESS FULL| TABLE2 | 51 | 1326 | 142 (0)| 00:00:02 |
|* 5 | INDEX RANGE SCAN | IDX1 | 2 | 46 | 2 (0)| 00:00:01 |
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
5 - access("T1"."COL2"="T2"."COL2")
W tym przypadku Oracle będzie czytać wiersze z Table2 i dla każdego (unikalne) rzędu, wykonać dostęp indeksu na tabela1 .
Który dostęp jest szybszy, zależy od selektywności zapytania wewnętrznego i grupowania indeksu na TABELĘ 1 (czy wiersze o podobnej wartości wynoszą col2
w TABELI 1 obok siebie lub losowo rozłożone?). W każdym razie, jeśli chodzi o wydajność, jeśli chcesz wykonać tę aktualizację, to jest to jedna z najszybszych metod.
Jeśli sub-zapytanie zwróci 10000 wyników runtime będzie zerowy, ponieważ zgłasza błąd. Zakładam, że chcesz napisać IN zamiast = dla podselekcji? –
Masz to. Dokonałem zmiany, dziękuję. – Vivek
, jeśli odpowiedź udzielona przez @zerkms była dla Ciebie pomocna, zaakceptuj to. Sprawdź FAQ, aby dowiedzieć się, dlaczego powinieneś to zrobić. :-) –