Oracle SQL-запрос работает (почти) навсегда - PullRequest
0 голосов
/ 19 августа 2010

Моё приложение пытается выполнить запрос count (*), который возвращается примерно через 30 минут.Странно то, что запрос очень прост, а используемые таблицы большие, но не гигантские (10000 и 50000 записей).

Запрос, который занимает 30 минут:Схема базы данных по существу:

create table BATCH (
    BATCH_ID int not null,
    [other columns]...,
    CONSTRAINT PK_BATCH PRIMARY KEY (BATCH_ID)
);

create table GROUP (
    GROUP_ID int not null,
    BATCH_ID int,
    ENABLED char(1) not null,
    [other columns]...,
    CONSTRAINT PK_GROUP PRIMARY KEY (GROUP_ID),
    CONSTRAINT FK_GROUP_BATCH_ID FOREIGN KEY (BATCH_ID)
        REFERENCES BATCH (BATCH_ID),
    CONSTRAINT CHK_GROUP_ENABLED CHECK(ENABLED in ('Y', 'N'))
);

create table RECORD (
    GROUP_ID int not null, 
    RECORD_NUMBER int not null,
    [other columns]...,
    CONSTRAINT PK_RECORD PRIMARY KEY (GROUP_ID, RECORD_NUMBER),
    CONSTRAINT FK_RECORD_GROUP_ID FOREIGN KEY (GROUP_ID)
        REFERENCES GROUP (GROUP_ID)
);

create index IDX_GROUP_BATCH_ID on GROUP(BATCH_ID);

Я проверил, есть ли в базе данных какие-либо блоки и их нет.Я также выполнил следующие части запроса, и все, кроме двух последних, мгновенно вернулись:

select count(*) from RECORD -- 55,501

select count(*) from GROUP -- 11,693

select count(*) 
from RECORD r inner join GROUP g 
  on g.GROUP_ID = r.GROUP_ID
-- 55,501

select count(*) 
from GROUP g 
where g.BATCH_ID = 1 and g.ENABLED = 'Y' 
-- 3,112

select count(*) 
from RECORD r inner join GROUP g 
  on g.GROUP_ID = r.GROUP_ID 
where g.BATCH_ID = 1 
-- 27,742 - took around 5 minutes to run

select count(*) 
from RECORD r inner join GROUP g 
  on g.GROUP_ID = r.GROUP_ID 
where g.ENABLED = 'Y' 
-- 51,749 - took around 5 minutes to run

Может кто-нибудь объяснить, что происходит?Как я могу улучшить производительность запроса?Спасибо.

Ответы [ 3 ]

1 голос
/ 19 августа 2010

Сотрудник выяснил проблему.Это связано с тем, что статистика таблицы не обновлялась, а последний раз, когда таблица анализировалась, пару месяцев назад (когда таблица была практически пустой).Я выполнил анализ статистики вычислений таблицы RECORD, и теперь запрос возвращается менее чем за секунду.

Мне нужно поговорить с администратором базы данных о том, почему статистика таблицы не обновлялась.

0 голосов
/ 19 августа 2010

План объяснения будет хорошим началом.

Смотрите здесь:

Странные изменения скорости с SQL-запросом

о том, как использовать синтаксис плана объяснения (и запросить, чтобы увидеть результат.)

Если в этом нет ничего подозрительного, вы, вероятно, захотите взглянуть на след.

0 голосов
/ 19 августа 2010
SELECT COUNT(*)  
FROM   RECORD R
LEFT OUTER JOIN GROUP G ON G.GROUP_ID = R.GROUP_ID  
       AND G.BATCH_ID = 1
       AND G.ENABLED = 'Y'

Попробуйте и дайте мне знать, как это получается.Не сказать, что это ответ, но поскольку у меня сейчас нет доступа к БД, я не могу это проверить.Надеюсь, что это работает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...