2017-07-01 1 views
1

Einnahme habe ich eine Tabelle in Oracle:Insert-Sequenz lange Zeit

table1 

record_id variable  value 
1   100   50 
1   101   40 
2   100   30 
2   101   60 
1   102   100 

Es hat mehr als 7 Millionen Zeilen. Ich möchte eine weitere Spalte als eindeutige ID hinzufügen. So würde die Tabelle in etwa so aussehen:

table1 

id   record_id variable  value 
1   1   100   50 
2   1   101   40 
3   2   100   30 
4   2   101   60 
5   1   102   100 

Aber wenn ich versuche, sie aktualisieren mit:

UPDATE table1 SET id = my_sequence.nextval;

Es dauert lange. Gibt es einen schnelleren Weg, dies zu erreichen?

ist die Tabellenabfrage erstellen:

CREATE TABLE "ABCUSER"."NUM_VAL" 
("RECORD_ID" NUMBER(*,0), 
"VAR" NUMBER, 
"VAR_SEQUENCE" NUMBER, 
"VAR_DATATYPE" NUMBER, 
"CREATED_DATE" DATE, 
"UPDATED_DATE" DATE, 
"VAR_VALUE_NUMBER" VARCHAR2(40 BYTE), 
"VAR_VALUE_TEXT" VARCHAR2(255 BYTE), 
"VAR_VALUE_DATE" DATE, 
"ID" NUMBER 
) SEGMENT CREATION IMMEDIATE 
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
NOCOMPRESS NOLOGGING 
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
TABLESPACE "USERS" ; 

CREATE INDEX "ABCUSER"."IMD_TB_UNIQUE_ID" ON "ABCUSER"."NUM_VAL" ("RECORD_ID") 
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
TABLESPACE "USERS" ; 

Sequenz:.

CREATE SEQUENCE "ABCUSER" "MY_SEQUENCE" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START MIT 10186338807 CACHE 100 NOORDER NOCYCLE;

+0

@MikeNakis - done – dang

+1

pOrinGs Antwort wird funktionieren, aber ich denke nicht, dass es irgendwelche großen Leistungsvorteile bringen wird, da Sequenzen in hohem Maße optimiert sind. Wenn die Sequenz der Engpass ist, ist es sehr einfach, die CACHE-Klausel der Sequenz von "100" zu "1000" oder zu "10000" zu ändern, um ihre Leistung um Grßenordnungen zu verbessern. Ich denke, Sie sollten auch definieren, was Sie mit "langer Zeit" meinen, denn 7 Millionen Datensätze benötigen einige Zeit, um selbst im optimalen Szenario zu aktualisieren. –

+0

Welche Version von Oracle? – APC

Antwort

3

Das Aktualisieren aller 7 Millionen Zeilen (die gesamte Tabelle) muss einige Zeit dauern.
Ein schneller Weg ist, eine Kopie dieser Tabelle zu erstellen:

CREATE TABLE NUM_VAL_copy AS SELECT 
    "RECORD_ID" , 
    "VAR" , 
    "VAR_SEQUENCE" , 
    "VAR_DATATYPE" , 
    "CREATED_DATE" , 
    "UPDATED_DATE" , 
    "VAR_VALUE_NUMBER", 
    "VAR_VALUE_TEXT" , 
    "VAR_VALUE_DATE" , 
    my_sequence.nextval AS "ID" 
FROM NUM_VAL; 

dann Index new_table gewähren Privilegien, fügen Beschränkungen für neue Tabelle usw.
und schließlich fallen alte Tabelle und neue Tabelle alten Namen umbenannt werden:

DROP TABLE NUM_VAL; 
RENAME NUM_VAL_COPY TO NUM_VAL; 

Bitte überprüfen Sie die Dokumentation: https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9019.htm#SQLRF01608

0

Wenn Sie möchten, dass die Sequenz mit 1 ... 2 ... 3 ... auf Stationen beginnt, können Sie Folgendes verwenden.

update table_name set unique_seq = rownum; 

Ich versuchte es auf einer Tabelle mit 6 Datensätzen und es funktioniert gut. Ich bin mir nicht 100% sicher, ob dies der ideale Weg ist, aber ich denke, es wird schneller als nextval sein.

Wenn Sie später noch Ihre definierte Sequenz aus irgendeinem Grund möchten, können Sie die Orakelsequenz aktualisieren, um von der max (unique_seq) Nummer zu starten.

0
  1. Wenn Sie Oracle RAC verwenden, könnte dies ein Problem darstellen. Eine kleine zwischengespeicherte Sequenz hat Auswirkungen auf die Leistung. Verwenden Sie keine Reihenfolge, Cache zum Erstellen Ihrer Sequenz.

  2. 7 Millionen Zeilen ist keine große Zahl. Möglicherweise möchten Sie überprüfen, ob während der Aktualisierung ein Problem mit der Anwendungsblockierung vorliegt. Das ist ein DBA-Job. Sie müssen das Schloss für Sie überprüfen.

  3. Wenn Sie eine create-Tabelle erstellen können, um Werte hinzuzufügen, ist dies viel schneller als eine Aktualisierung.

Umbenennen von Tabelle1 in Tabelle2; create table table1 Wählen Sie/* + append */*, [idvalue] id aus table2;