Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Другие СУБД > Почему не используется индекс при джойне?


Автор: Barvetal 6.10.2006, 00:19
Всем привет!

А задача предельно простая: есть две таблицы. Нужно сделать джойн этих таблиц и вывести первые две результирующие записи. 
Размер этих таблиц - по 140000 записей в каждой. Запрос выполняется 15 секунд. Смотрю по плану - сервер ДБ2 при выполнения джойна не использует индексы (а использует MSJOIN вместо NLJOIN). Не могу понять, почему. Разьясните, пожалуйста, как я могу ускорить работу этого джойна? 

Версия базы - DB2 8.2 (фикспак тот, который месяц назад был последним, это вроде 13-й)

Помогите пожалуйста!

А теперь подробная информация. 

Запрос:

Код

select * from ( 
    select rownumber() over(order by Document.dcm_viewFrom desc) as rownumber_, Document.*, News.*
    from News join Document on News.dcm_unid=Document.dcm_unid) 
as temp_ 
where rownumber_ <= 2


Рисунок плана выполнения запроса находится по ссылке:
http://users.g.com.ua/~vitaly_b/sshots/JoinPlan.jpg или здесь: http://files.adamant.ua/9509

Скрипт создания таблицы Document


Код

CREATE TABLE LIGAOL.DOCUMENT ( 
    DCM_UNID       CHARACTER(32) NOT NULL,
    ENTT_ID        VARCHAR(32),
    DCM_IDENTIFIER    CHARACTER(12) NOT NULL,
    DCM_TITLE      VARCHAR(254),
    DCM_BODY       BLOB(5000000),
    DCM_CREATOR    VARCHAR(62),
    DCM_DATE       TIMESTAMP,
    DCM_TYPE       INTEGER,
    DCM_ISVIEWABLE    SMALLINT,
    DCM_VIEWFROM    TIMESTAMP,
    DCM_VIEWTO     TIMESTAMP,
    DCM_AUTHORS    VARCHAR(126),
    PRIMARY KEY(DCM_UNID)
)
GO
ALTER TABLE LIGAOL.DOCUMENT
    ADD CONSTRAINT CC1160057360992
    UNIQUE (DCM_IDENTIFIER)
GO
ALTER TABLE LIGAOL.DOCUMENT
    ADD CONSTRAINT F_DOC2ENTT
    FOREIGN KEY(ENTT_ID) REFERENCES LIGAOL.ENTITY(ENTT_ID)
GO
CREATE INDEX LIGAOL.DCM_FV_ENID
    ON LIGAOL.DOCUMENT(DCM_VIEWFROM DESC, ENTT_ID)  PCTFREE 10 MINPCTUSED 10
GO
CREATE INDEX LIGAOL.DOC2ENTT_FK
    ON LIGAOL.DOCUMENT(ENTT_ID)
GO


Скрипт создания таблицы NEWS:


Код

CREATE TABLE LIGAOL.NEWS ( 
    DCM_UNID          CHARACTER(32) NOT NULL,
    RBC_ID            INTEGER,
    NWS_TOP           SMALLINT,
    NWS_FIO           VARCHAR(512),
    NWS_ANNOTATION    VARCHAR(2048),
    NWS_LAWESCORT     CLOB(65000),
    NWS_CONTACTINFO    CLOB(16000),
    NWS_SHOWSIGNATURE    SMALLINT,
    NWS_PICTURENAME    VARCHAR(256),
    NWS_ISARCHIVE     SMALLINT,
    PRIMARY KEY(DCM_UNID)
)
GO
ALTER TABLE LIGAOL.NEWS
    ADD CONSTRAINT F_RBC_TO_NWS
    FOREIGN KEY(RBC_ID) REFERENCES LIGAOL.RUBRIC(RBC_ID)
GO
ALTER TABLE LIGAOL.NEWS
    ADD CONSTRAINT FK24FEF311B2BCF5
    FOREIGN KEY(DCM_UNID) REFERENCES LIGAOL.DOCUMENT(DCM_UNID)
GO
CREATE INDEX LIGAOL.RBC_TO_NWS_FK
    ON LIGAOL.NEWS(RBC_ID)
GO


Да, статистика вся построена и актуальна. Вот она:
http://users.g.com.ua/~vitaly_b/sshots/statdoc.jpg и http://users.g.com.ua/~vitaly_b/sshots/statnews.jpg
Почему DB2 не использует индекс при джойне?


Всем заранее спасибо!

Автор: dvska 24.1.2007, 16:48
Попробуй тут http://www.sql.ru/forum/actualtopics.aspx?bid=5 спросить

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)