2016-04-21 5 views
2

Ich bin in der Notwendigkeit der Aktualisierung einer riesigen Tabelle,> 1 Milliarde Datensätze (POS-Daten) mit einem Schlüssel aus einer Tabelle basierend auf einer Verknüpfung mit einer dritten Tabelle. Ich kann die Updates aufgrund von Datumsangaben abbrechen, da dies mehrere Jahre zurückreicht. Ich muss im Grunde den f.retail_sku_key in der Tabelle edw.f_pos_daily mit dem dedup.retail_sku_key ersetzen, wenn sie nicht identisch sind. Danke!Oracle Update basierend auf Beitritt von 2 anderen Tabellen

select F.POS_KEY, f.retail_sku_key , dedup.retail_sku_key dedup_key 
from edw.f_pos_daily f,edw.d_retail_sku sku, edw.d_retail_sku_new dedup 
where f.retail_sku_key = sku.retail_sku_key 
and sku.retail_sku = dedup.retail_sku 
and sku.mtd_item_number = dedup.mtd_item_number 
and sku.retailer = dedup.retailer 
and f.retail_sku_key <> dedup.retail_sku_key 
+0

Sie können versuchen, BULK COLLECT FORALL Update als Daten zu verwenden. Am besten, um große Daten zu aktualisieren –

+0

Was ist Ihre Frage - wie wird ein korreliertes Update durchgeführt? Ob das Update in einem Treffer oder in Stufen basierend auf Datumsbereichen durchgeführt wird? Etwas anderes? Ein einzelnes Update wäre am effizientesten, wenn Sie genügend Speicherbereich zur Verfügung haben. –

+0

Alex, ich würde gerne ein Corelated Update in einem Treffer machen, wenn möglich. Ich laufe auf Exadata und Platz ist kein Problem. –

Antwort

0

Zwar gibt es wahrscheinlich ein UPDATE äquivalent, ziehe ich MERGE zu verwenden, wenn eine SQL-Anweisung treibt, welche Zeilen aktualisiert werden müssen und die Werte zu erzeugen mit zur gleichen Zeit zu aktualisieren.

Also so etwas? (Ich gehe davon aus, dass f.pos_key ist eine eindeutige Kennung auf dieser f_pos_daily Tabelle. Wenn das nicht der Fall und die Abfrage gibt mehr als eine Zeile für den gleichen f_pos_key Wert, dies fehl.)

MERGE INTO edw.f_pos_daily f_main 
USING (
select f.pos_key -- this is for joining back to the rows that need to be updated... 
    , dedup.retail_sku_key dedup_key -- ...and this is the value to update them with 
    from edw.f_pos_daily f 
    , edw.d_retail_sku sku 
    , edw.d_retail_sku_new dedup 
where f.retail_sku_key = sku.retail_sku_key 
    and sku.retail_sku = dedup.retail_sku 
    and sku.mtd_item_number = dedup.mtd_item_number 
    and sku.retailer = dedup.retailer 
    and f.retail_sku_key <> dedup.retail_sku_key 
    ) qry 
ON (f_main.pos_key = qry.pos_key) 
WHEN MATCHED THEN 
    UPDATE SET f_main.retail_sku_key = qry.dedup_key 
; 

Wenn Sie müssen dies in separate Updates aufteilen, die Sie in conquer auf zwei Arten teilen können:

1) Isolieren Sie Partitionen in f_pos_daily in der internen Abfrage (vorausgesetzt, die Tabelle ist partitioniert durch etwas anderes als retail_sku_key) z FROM edw.f_pos_daily PARTITION (p_some_partition_name) und die obige Aussage einmal für jede Partition ausgeführt

2) Generieren Bereiche der Zeilen zu aktualisieren (auch hier mit der f_pos_key = eindeutige Annahme), die jeweils etwa 10% der Zeilen aktualisiert:

SELECT MIN(f_pos_key) c0, 
PERCENTILE_DISC(0.1) WITHIN GROUP (ORDER BY f_pos_key) p1, 
PERCENTILE_DISC(0.2) WITHIN GROUP (ORDER BY f_pos_key) p2, 
PERCENTILE_DISC(0.3) WITHIN GROUP (ORDER BY f_pos_key) p3, 
PERCENTILE_DISC(0.4) WITHIN GROUP (ORDER BY f_pos_key) p4, 
PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY f_pos_key) p5, 
PERCENTILE_DISC(0.6) WITHIN GROUP (ORDER BY f_pos_key) p6, 
PERCENTILE_DISC(0.7) WITHIN GROUP (ORDER BY f_pos_key) p7, 
PERCENTILE_DISC(0.8) WITHIN GROUP (ORDER BY f_pos_key) p8, 
PERCENTILE_DISC(0.9) WITHIN GROUP (ORDER BY f_pos_key) p9, 
MAX(f_pos_key) c4 
FROM edw.f_pos_daily; 

Wenn die Werte zwischen 0 und 1000 (und einige unbekannte Anzahl von Zeilen) reichte, wird diese Ihnen Ausgang geben wie:

P0 P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 
0 104 183 319 402 512 607 723 810 914 1000 

von hier hat man nur eine weitere Bedingung in der Unterabfrage enthalten müssen haben

AND f.pos_key BETWEEN 0 AND 104 

auf dem ersten Lauf dann

AND f.pos_key BETWEEN 105 AND 183 

auf dem zweiten Durchlauf, und so weiter.

Verwandte Themen