Цитата: isi ➤ при твоем условии
Код:
f.saledate>=to_date('20.01.2005','DD.MM.YYYY')
and f.saledate<=to_date('19.01.2009','DD.MM.YYYY')
Oracle в любом случае сделает фулскан, ты же всю таблицу отбираешь, нафига ему индексный доступ
да нет даже если дату изменить с '20.01.2005' на '20.01.2008' все равно фулскан..
Так что сделано и что получилось:
Перепартиционировал таблицу FFMAPREP было по RANGE(saledate) по месяцам, сделал как у Олега по LIST и RANGE
http://www.olegon.ru/showthread.php?...ight=PARTITION
только подразбил еще 2007 год по кварталам, индексы от FFMAPREP выкинул в отдельный таблспейс. Индексы создавал обычные, имхо BITMAP
только для поля INCOMECLIENTINDEX подходит, в остальных используется saledate или saleid -битмап по ним будет очень долго создаваться, насчет выигрыша не знаю, если кто знает скажите.
Код:
--переименовываем таблицу FFMAPREP
ALTER TABLE SUPERMAG.FFMAPREP RENAME TO FFMAPREP_OLD;
--создаем таблспейс для FFMAPREP
CREATE TABLESPACE SM_ANAL_FFMAPREP
DATAFILE 'D:\ORACLE\ORADATA\VLIGCO\FFMAPREP01.DBF' SIZE 2G AUTOEXTEND OFF,
'D:\ORACLE\ORADATA\VLIGCO\FFMAPREP02.DBF' SIZE 2G AUTOEXTEND OFF,
'D:\ORACLE\ORADATA\VLIGCO\FFMAPREP03.DBF' SIZE 2G AUTOEXTEND OFF,
'D:\ORACLE\ORADATA\VLIGCO\FFMAPREP04.DBF' SIZE 2G AUTOEXTEND OFF
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
NOLOGGING
ONLINE
SEGMENT SPACE MANAGEMENT MANUAL;
--создаем таблспейс для индексов FFMAPREP
CREATE TABLESPACE FF_INDEX_MAPREP
DATAFILE 'F:\ORACLE\ORADATA\VLIGCO\FFINDX01.DBF' SIZE 2G AUTOEXTEND OFF,
'F:\ORACLE\ORADATA\VLIGCO\FFINDX02.DBF' SIZE 2G AUTOEXTEND OFF,
'F:\ORACLE\ORADATA\VLIGCO\FFINDX03.DBF' SIZE 2G AUTOEXTEND OFF,
'F:\ORACLE\ORADATA\VLIGCO\FFINDX04.DBF' SIZE 2G AUTOEXTEND OFF
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
NOLOGGING
ONLINE
SEGMENT SPACE MANAGEMENT AUTO;
--даем права на таблспейсы пользователю SUPERMAG
ALTER USER SUPERMAG QUOTA UNLIMITED ON FF_INDEX_MAPREP;
ALTER USER SUPERMAG QUOTA UNLIMITED ON SM_ANAL_FFMAPREP;
--создаем партиционированную таблицу FFMAPREP
create table SUPERMAG.FFMAPREP
PCTFREE 0
INITRANS 30
MAXTRANS 255
TABLESPACE SM_ANAL_FFMAPREP
NOLOGGING
PARTITION BY RANGE (saledate)
SUBPARTITION BY LIST (saletype)
(
PARTITION ff_2006 VALUES LESS THAN (TO_DATE('01012007','DDMMYYYY'))
(SUBPARTITION ff_2006_wi VALUES ('WI'),
SUBPARTITION ff_2006_wo VALUES ('WO'),
SUBPARTITION ff_2006_cs VALUES ('CS'),
SUBPARTITION ff_2006_cr VALUES ('CR')
),
PARTITION ff1_2007 VALUES LESS THAN (TO_DATE('01042007','DDMMYYYY'))
(SUBPARTITION ff1_2007_wi VALUES ('WI'),
SUBPARTITION ff1_2007_wo VALUES ('WO'),
SUBPARTITION ff1_2007_cs VALUES ('CS'),
SUBPARTITION ff1_2007_cr VALUES ('CR')
),
PARTITION ff2_2007 VALUES LESS THAN (TO_DATE('01072007','DDMMYYYY'))
(SUBPARTITION ff2_2007_wi VALUES ('WI'),
SUBPARTITION ff2_2007_wo VALUES ('WO'),
SUBPARTITION ff2_2007_cs VALUES ('CS'),
SUBPARTITION ff2_2007_cr VALUES ('CR')
),
PARTITION ff3_2007 VALUES LESS THAN (TO_DATE('01102007','DDMMYYYY'))
(SUBPARTITION ff3_2007_wi VALUES ('WI'),
SUBPARTITION ff3_2007_wo VALUES ('WO'),
SUBPARTITION ff3_2007_cs VALUES ('CS'),
SUBPARTITION ff3_2007_cr VALUES ('CR')
),
PARTITION ff4_2007 VALUES LESS THAN (TO_DATE('01012008','DDMMYYYY'))
(SUBPARTITION ff4_2007_wi VALUES ('WI'),
SUBPARTITION ff4_2007_wo VALUES ('WO'),
SUBPARTITION ff4_2007_cs VALUES ('CS'),
SUBPARTITION ff4_2007_cr VALUES ('CR')
),
PARTITION ff1_2008 VALUES LESS THAN (TO_DATE('01042008','DDMMYYYY'))
(SUBPARTITION ff1_2008_wi VALUES ('WI'),
SUBPARTITION ff1_2008_wo VALUES ('WO'),
SUBPARTITION ff1_2008_cs VALUES ('CS'),
SUBPARTITION ff1_2008_cr VALUES ('CR')
),
PARTITION ff2_2008 VALUES LESS THAN (TO_DATE('01072008','DDMMYYYY'))
(SUBPARTITION ff2_2008_wi VALUES ('WI'),
SUBPARTITION ff2_2008_wo VALUES ('WO'),
SUBPARTITION ff2_2008_cs VALUES ('CS'),
SUBPARTITION ff2_2008_cr VALUES ('CR')
),
PARTITION ff3_2008 VALUES LESS THAN (TO_DATE('01102008','DDMMYYYY'))
(SUBPARTITION ff3_2008_wi VALUES ('WI'),
SUBPARTITION ff3_2008_wo VALUES ('WO'),
SUBPARTITION ff3_2008_cs VALUES ('CS'),
SUBPARTITION ff3_2008_cr VALUES ('CR')
),
PARTITION ff4_2008 VALUES LESS THAN (TO_DATE('01012009','DDMMYYYY'))
(SUBPARTITION ff4_2008_wi VALUES ('WI'),
SUBPARTITION ff4_2008_wo VALUES ('WO'),
SUBPARTITION ff4_2008_cs VALUES ('CS'),
SUBPARTITION ff4_2008_cr VALUES ('CR')
),
PARTITION ff1_2009 VALUES LESS THAN (TO_DATE('01042009','DDMMYYYY'))
(SUBPARTITION ff1_2009_wi VALUES ('WI'),
SUBPARTITION ff1_2009_wo VALUES ('WO'),
SUBPARTITION ff1_2009_cs VALUES ('CS'),
SUBPARTITION ff1_2009_cr VALUES ('CR')
),
PARTITION ff2_2009 VALUES LESS THAN (TO_DATE('01072009','DDMMYYYY'))
(SUBPARTITION ff2_2009_wi VALUES ('WI'),
SUBPARTITION ff2_2009_wo VALUES ('WO'),
SUBPARTITION ff2_2009_cs VALUES ('CS'),
SUBPARTITION ff2_2009_cr VALUES ('CR')
),
PARTITION ff3_2009 VALUES LESS THAN (TO_DATE('01102009','DDMMYYYY'))
(SUBPARTITION ff3_2009_wi VALUES ('WI'),
SUBPARTITION ff3_2009_wo VALUES ('WO'),
SUBPARTITION ff3_2009_cs VALUES ('CS'),
SUBPARTITION ff3_2009_cr VALUES ('CR')
),
PARTITION ff4_2009 VALUES LESS THAN (TO_DATE('01012010','DDMMYYYY'))
(SUBPARTITION ff4_2009_wi VALUES ('WI'),
SUBPARTITION ff4_2009_wo VALUES ('WO'),
SUBPARTITION ff4_2009_cs VALUES ('CS'),
SUBPARTITION ff4_2009_cr VALUES ('CR')
)
)
AS SELECT * FROM SUPERMAG.FFMAPREP_OLD;
--даем права должности SUPERMAG_FN_REPADMIN_CALC
grant select, insert, update on SUPERMAG.FFMAPREP to SUPERMAG_FN_REPADMIN_CALC;
--удаляем индексы старого FFMAPREP_OLD
DROP INDEX SUPERMAG.FFMAPREP_ARTICLE;
DROP INDEX SUPERMAG.FFMAPREP_DOC;
DROP INDEX SUPERMAG.FFMAPREP_LOCFROM;
DROP INDEX SUPERMAG.FFMAPREP_LOCTO;
DROP INDEX SUPERMAG.FFMAPREP_SALEDATE;
DROP INDEX SUPERMAG.FFMAPREP_SUPPLIER;
--создаем новые индексы
create index SUPERMAG.FFMAPREP_ARTICLE on SUPERMAG.FFMAPREP (ARTICLE ASC)
tablespace FF_INDEX_MAPREP
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
)
NOLOGGING
;
create index SUPERMAG.FFMAPREP_DOC on SUPERMAG.FFMAPREP (SALEID ASC, SALETYPE ASC, SALESPECITEM ASC)
tablespace FF_INDEX_MAPREP
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
)
NOLOGGING LOCAL
;
create index SUPERMAG.FFMAPREP_LOCFROM on SUPERMAG.FFMAPREP (SALELOCATIONFROM ASC, SALEDATE ASC)
tablespace FF_INDEX_MAPREP
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
)
NOLOGGING LOCAL
;
create index SUPERMAG.FFMAPREP_LOCTO on SUPERMAG.FFMAPREP (SALELOCATIONTO ASC, SALEDATE ASC)
tablespace FF_INDEX_MAPREP
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
)
NOLOGGING LOCAL
;
create index SUPERMAG.FFMAPREP_SALEDATE on SUPERMAG.FFMAPREP (SALEDATE ASC)
tablespace FF_INDEX_MAPREP
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
)
NOLOGGING LOCAL
;
create BITMAP index SUPERMAG.FFMAPREP_SUPPLIER on SUPERMAG.FFMAPREP (INCOMECLIENTINDEX ASC)
tablespace FF_INDEX_MAPREP
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
После этого откомпиллировал инвалидов и собрал статистику по всей схеме SUPERMAG.
Для
Код:
select sum(decode(f.saletype,'CR',-f.salesum,f.salesum)) realiz
from supermag.ffmaprep f
where f.rectype=1 and f.saletype in ('CR','CS')
and f.saledate>=to_date('20.01.2005','DD.MM.YYYY')
and f.saledate<=to_date('19.01.2009','DD.MM.YYYY')
and f.article in (select c.article from supermag.smcard c where c.accepted<>-1)
Время выполнения: 192 секунды (уже не 631, это радует)
План
Код:
-------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
-------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 34 | 135K (3)| 00:27:10 | | |
| 1 | SORT AGGREGATE | | 1 | 34 | | | | |
|* 2 | HASH JOIN | | 26M| 844M| 135K (3)| 00:27:10 | | |
|* 3 | TABLE ACCESS FULL | SMCARD | 52438 | 409K| 242 (2)| 00:00:03 | | |
| 4 | PARTITION RANGE ITERATOR| | 26M| 646M| 135K (3)| 00:27:05 | 1 | 10 |
| 5 | PARTITION LIST INLIST | | 26M| 646M| 135K (3)| 00:27:05 |KEY(I) |KEY(I) |
|* 6 | TABLE ACCESS FULL | FFMAPREP | 26M| 646M| 135K (3)| 00:27:05 | KEY | KEY |
-------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("F"."ARTICLE"="C"."ARTICLE")
3 - filter("C"."ACCEPTED"<>(-1))
6 - filter("F"."RECTYPE"=1 AND "F"."SALEDATE"<=TO_DATE(' 2009-01-19 00:00:00', 'syyyy-mm-dd
hh24:mi:ss') AND "F"."SALEDATE">=TO_DATE(' 2005-01-20 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
Ну с SMCARD все понятно операция <>(!=) отменяет действие индекса если поставить accepted in (0,1,2) план по карточкам переходит из фулскана в индекс(при этом время выполения разпроса уже 154 сек.), но вот план по FFMAPREP странный...фулскан..
меняем дату
Код:
select sum(decode(f.saletype,'CR',-f.salesum,f.salesum)) realiz
from supermag.ffmaprep f
where f.rectype=1 and
f.saletype in ('CR','CS')
and f.saledate>=to_date('01.12.2008','DD.MM.YYYY')
and f.saledate<=to_date('19.01.2009','DD.MM.YYYY')
and f.article in (select c.article from supermag.smcard c where c.accepted <>-1)
План
Код:
-------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
-------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 34 | 23131 (2)| 00:04:38 | | |
| 1 | SORT AGGREGATE | | 1 | 34 | | | | |
|* 2 | HASH JOIN | | 1964K| 63M| 23131 (2)| 00:04:38 | | |
|* 3 | TABLE ACCESS FULL | SMCARD | 52438 | 409K| 242 (2)| 00:00:03 | | |
| 4 | PARTITION RANGE ITERATOR| | 1964K| 48M| 22874 (2)| 00:04:35 | 9 | 10 |
| 5 | PARTITION LIST INLIST | | 1964K| 48M| 22874 (2)| 00:04:35 |KEY(I) |KEY(I) |
|* 6 | TABLE ACCESS FULL | FFMAPREP | 1964K| 48M| 22874 (2)| 00:04:35 | KEY | KEY |
-------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("F"."ARTICLE"="C"."ARTICLE")
3 - filter("C"."ACCEPTED"<>(-1))
6 - filter("F"."SALEDATE">=TO_DATE(' 2008-12-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND
"F"."RECTYPE"=1 AND "F"."SALEDATE"<=TO_DATE(' 2009-01-19 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
Только стоимость и расчетное время выборки поменялось, а операции те же и фулскан тот же..
Буду дальше копать..