Страница 1 из 1

Оптимизация удаления с запросом

Добавлено: 22 мар 2005, 19:37
Deniska
Привет All
Возникла проблемка , есть связка мастер-детейл
, проблема удаления из детейл ,можна ли как то оптимизировать ,
нуно выполнить
В мастере милион записей в детейле 3 милиона
delete from inout io where io.pid in
(select id from invoices i where i.the_date<'01.01.2004' )
пробывал и так
delete from inout io where io.pid in
(select id from invoices i where i.the_date<'01.01.2004' and io.pid=i.id)
и через екзист пробывал .

мастер

Код: Выделить всё

CREATE DOMAIN IDN AS
INTEGER
NOT NULL

CREATE DOMAIN MNY AS
NUMERIC(16,4)

CREATE DOMAIN NAMEN AS
VARCHAR(20) CHARACTER SET NONE
NOT NULL
COLLATE NONE

CREATE TABLE INVOICES (
    ID              IDN /* INTEGER NOT NULL */,
    FROM_ID         IDN /* INTEGER NOT NULL */,
    TO_ID           IDN /* INTEGER NOT NULL */,
    DOC_TYPE        SMALLINT NOT NULL,
    THE_DATE        DATE,
    INTERVAL_ID     SMALLINT NOT NULL,
    DOC_SUM         MNY /* NUMERIC(16,4) */ DEFAULT 0,
    CURRENCY_ID     SMALLINT NOT NULL,
    CURRENCY_VALUE  MNYN /* NUMERIC(16,4) NOT NULL */ NOT NULL,
    DSC             VARCHAR(200),
    FIRM_ID         SMALLINT NOT NULL,
    DOC_NO          VARCHAR(10),
    USER_ID         INTEGER NOT NULL,
    RESPONSIBLE_ID  INTEGER
);

CREATE INDEX INVOICES_IDX1 ON INVOICES (FROM_ID);
CREATE INDEX INVOICES_IDX2 ON INVOICES (TO_ID);
CREATE INDEX INVOICES_IDX3 ON INVOICES (THE_DATE);
CREATE UNIQUE INDEX RDB$PRIMARY23 ON INVOICES (ID);
ALTER INDEX RDB$PRIMARY23 INACTIVE;

детейл
CREATE TABLE INOUT (
    ID           IDN /* INTEGER NOT NULL */,
    PID          IDN /* INTEGER NOT NULL */,
    GOOD_ID      IDN /* INTEGER NOT NULL */,
    PART_ID      INTEGER,
    QTY          MNYN /* NUMERIC(16,4) NOT NULL */,
    PRC          MNYN /* NUMERIC(16,4) NOT NULL */,
    FULLPRC      MNY /* NUMERIC(16,4) */,
    DISCOUNT     MNY /* NUMERIC(16,4) */,
    GOOD_DSC     VARCHAR(24),
    PACKID       INTEGER,
    PRINT_COUNT  INTEGER default 0
);

CREATE INDEX INOUT_IDX1 ON INOUT (PID);
CREATE INDEX INOUT_IDX2 ON INOUT (GOOD_ID);
CREATE UNIQUE INDEX RDB$PRIMARY21 ON INOUT (ID);
ALTER INDEX RDB$PRIMARY21 INACTIVE;



Добавлено: 22 мар 2005, 20:09
kdv

Код: Выделить всё

CREATE UNIQUE INDEX RDB$PRIMARY23 ON INVOICES (ID);
ALTER INDEX RDB$PRIMARY23 INACTIVE; 
а это что это за...?

почему не нормальный ПК, а unique? unique в 1.5 допускает null, как положено по стандарту. для первичного ключа должен использоваться только primary key.
И почему индексы по ПК ДЕАКТИВИРОВАНЫ?
delete from inout io where io.pid in
(select id from invoices i where i.the_date<'01.01.2004' )
пробывал и так
delete from inout io where io.pid in
(select id from invoices i where i.the_date<'01.01.2004' and io.pid=i.id)
и через екзист пробывал .
непонятно, в чем проблема. ставится foreign key по связке invoices.id = inout.pid, с on delete cascade. в мастере (invoices) просто удаляются записи:

Код: Выделить всё

delete from invoices i where 
i.the_date<'01.01.2004'
то есть, структура базы должна быть нормальная. тогда выкрутасов с запросами не будет.

Добавлено: 23 мар 2005, 11:43
Deniska
Походу чо то с базой случилось потому что раньше (смотрю бекапы ) был примари кей , а не унику. А по поводу форинкей и каскадного удаления идея хорошая , тока не походит ,просто каскадное удаление мне не покатит ,очень много проверок , которые проще в коде реализовать

Добавлено: 23 мар 2005, 12:14
Merlin
Deniska писал(а):Походу чо то с базой случилось потому что раньше (смотрю бекапы ) был примари кей , а не унику.
Лунатизьм?

Добавлено: 23 мар 2005, 12:48
Deniska
Нет :) возможно кто то без меня с базой чо то творил , база не рабочая а тестовая для всех .