2017-12-08 1 views
1

Ich habe eine komplexe Anforderung, einige Datensätze in einer Tabelle zu aktualisieren, indem Sie mehrere Tabellen zusammenführen, um die richtigen Datensätze zu finden. Ich habe die folgende Abfrage geschrieben, die funktioniert, aber es dauert 2,5 Minuten, um ausgeführt zu werden, was mein DB Verbindungszeitlimit verursacht. Gibt es eine Möglichkeit, die Effizienz dieser Abfrage zu verbessern, indem Sie sie neu schreiben? Ich habe auch MERGE Ansatz versucht, die auch zu lange dauert. Ich habe mehr als 2 Millionen Datensätze in EVENT_DYNAMIC_ATTRIBUTE Tabelle und 1 Million Datensätze in EVENT-Tabelle und 100 tausend Datensätze in CATEGORY-Tabelle.Schreiben Sie eine effiziente Aktualisierungsabfrage, indem Sie mehrere Tabellen in Oracle verknüpfen.

UPDATE EVENT_DYNAMIC_ATTRIBUTE eda 
SET eda.ATTRIBUTE_VALUE = 'claim', 
    eda.LAST_UPDATED_DATE = SYSDATE, 
    eda.LAST_UPDATED_BY = 'superUsers' 
WHERE eda.DYNAMIC_ATTRIBUTE_NAME_ID=4002 
    AND eda.EVENT_ID IN 
    (SELECT e.EVENT_ID 
    FROM EVENT e 
    WHERE e.PRIMARY_CATEGORY_ID IN 
     (SELECT CATEGORY_ID 
      FROM CATEGORY START WITH CATEGORY_ID = 495984 CONNECT BY PARENT_ID = 
      PRIOR CATEGORY_ID)); 

Dies ist die Zusammenführung Abfrage:

MERGE INTO EVENT_DYNAMIC_ATTRIBUTE eda 
    USING (SELECT DISTINCT e.EVENT_ID FROM (
     SELECT CATEGORY_ID 
     FROM CATEGORY 
     START WITH CATEGORY_ID=495984 
     CONNECT BY PARENT_ID = 
     PRIOR CATEGORY_ID) CATEGORIES 
    INNER JOIN EVENT E ON e.PRIMARY_CATEGORY_ID = CATEGORY_ID 
    INNER JOIN EVENT_DYNAMIC_ATTRIBUTE ed on ed.EVENT_ID = E.EVENT_ID) temp 
    ON (eda.EVENT_ID = temp.EVENT_ID) 
    WHEN MATCHED THEN 
     UPDATE SET eda.ATTRIBUTE_VALUE = 'claim', 
        eda.LAST_UPDATED_DATE = SYSDATE, 
        eda.LAST_UPDATED_BY = 'superUser' 
    WHERE eda.DYNAMIC_ATTRIBUTE_NAME_ID=4002 
+0

MERGE wahrscheinlich der beste Weg ist, diese – GurV

+0

etwas zu erreichen ich immer darauf achten, in dieser Situation zu versuchen, zu 'ORDER BY ed.rowid' in Ihrem 'USING'-Klausel. In einem 'UPDATE' mit Joins hilft es sehr und ich vermute, dass es bei einem' MERGE' mit Joins helfen kann. Sieh diesen Thread: https://asktom.oracle.com/pls/asktom/asktom.search?tag=how-to-update-millions-or-records-in-a-table-200211#5402195700346034590. Ich habe gesehen, dass es eine Verbesserung von 40-60% gibt. –

Antwort

0

Sie so etwas wie

update 
    (
    select 
     eda.* 
    from 
     (select * from event_dynamic_attribute where dynamic_attribute_name_id = 4002) eda, 
     (select category_id from category start with category_id = 495984 connect by parent_id = prior category_id) c, 
     event e 
    where 
     e.primary_category_id = c.category_id and 
     e.event_id = eda.event_id 
) 
set 
    attribute_value = 'claim', 
    last_updated_date = sysdate, 
    last_updated_by = 'superUsers' 

versuchen können, aber ich bezweifle es hilft. Im Allgemeinen ist das sehr sehr langsam, auch wenn es auf alter Hardware funktioniert. Sie sollten sich diese Updates verfolgen und ihre Ausführung überprüfen, betroffenen Blöcke usw.

Zunächst einmal möchte ich Sie bitten,

explain plan for <<your update statement text>>; 
select * from table(dbms_xplan.display()); 

auszuführen, und schreiben Sie es in der Frage führen ist. Noch ein ... Gibt es Trigger in der Tabelle event_dynamic_attribute?

+0

Das Problem mit diesem Ansatz ist, bekomme ich immer den folgenden Fehler beim Ausführen der Abfrage. SQL-Fehler [1779] [42000]: ORA-01779: kann eine Spalte nicht ändern, die einer nicht Schlüssel-beibehaltenen Tabelle – user1614862

+0

zuordnet. Das ist seltsam, es sieht wie Schlüssel-beibehalten aus. Ist event_id ein PK für Ereignisse? category_id für Kategorien? Gibt es einen Primärschlüssel in event_dynamic_attribute? –

+0

ja, event_id ist ein pk für Ereignisse und category_id ist pk für Kategorien, event_dynamic_attribute_id ist pk für event_dynamic_attribute. – user1614862

-1

Sie können versuchen, Faktor KLAUSEL mit

http://www.dba-oracle.com/t_sql99_with_clause.htm

+0

Es ist viel besser, wenn Sie die relevanten Informationen in Ihrer Antwort kopieren und einfügen, anstatt einen Link zu veröffentlichen, der in Zukunft möglicherweise ungültig wird –

Verwandte Themen