У меня есть таблица с большими данными (около 10 миллионов записей), так что простейший оператор обновления будет длиться вечно.
Например:
update mesg
set archived = 1
, last_update = SYSDATE
where id = 0
and crea_date_time < '07/27/2011 13:53:36'
and archived = 0;
Это утверждение занимает около 3 часов. хотя у нас есть индекс по id и составной индекс по crea_date_time, а триггеров нет.
Могу ли я улучшить работу, чтобы улучшить производительность?
Я пытался добавить индекс в архив, но безрезультатно.
вот дополнительная информация.
CREATE TABLE "MESG"
(
"ID" NUMBER(3,0) NOT NULL ENABLE,
"UMIDL" NUMBER(10,0) NOT NULL ENABLE,
"UMIDH" NUMBER(10,0) NOT NULL ENABLE,
.
.
.
"ARCHIVED" NUMBER(1,0) NOT NULL ENABLE,
"LAST_UPDATE" DATE,
"CREA_DATE_TIME" DATE NOT NULL ENABLE,
.
.
.
CONSTRAINT "PK_RMESG" PRIMARY KEY ("AID", "UMIDH", "UMIDL") USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 524288 NEXT 524288 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "XXXX_IDX" ENABLE
)
SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE
(
INITIAL 524288 NEXT 524288 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT
)
TABLESPACE "XXXX_MESG" ;
Индексы:
CREATE INDEX "E_RCREATIONDATE" ON "RMESG"
(
"CREA_DATE_TIME"
)
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE
(
INITIAL 524288 NEXT 524288 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT
)
TABLESPACE "XXXX_IDX" ;
CREATE UNIQUE INDEX "PK_RMESG" ON "RMESG"
(
"ID", "UMIDH", "UMIDL"
)
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE
(
INITIAL 524288 NEXT 524288 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT
)
TABLESPACE "XXXX_IDX" ;
И план запроса для моей локальной машины с записями 180K
ID PID Operation Name Rows Bytes Cost CPU Cost IO Cost Temp space IN-OUT PQ Dist PStart PStop
0 UPDATE STATEMENT 1 44 877 6245703 877
1 0 UPDATE MESG
2 1 TABLE ACCESS BY INDEX ROWID MESG 1 44 877 6245703 877
3 2 INDEX RANGE SCAN IX_MESG_CREATIONDATE 158K 877 6245703 877