Une application de la mienne essaie d'exécuter une requête count (*) qui revient après environ 30 minutes. Ce qui est étrange, c'est que la requête est très simple et les tables impliquées sont grandes, mais pas gigantesques (10 000 et 50 000 enregistrements).Requête SQL Oracle exécutée pour (presque) à jamais
La requête qui prend 30 minutes est la suivante:
select count(*)
from RECORD r inner join GROUP g
on g.GROUP_ID = r.GROUP_ID
where g.BATCH_ID = 1 and g.ENABLED = 'Y'
Le schéma de base de données est essentiellement:
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);
Je vérifie s'il y a des blocs dans la base de données et il n'y en a pas. J'ai aussi couru les morceaux de la requête et tous, sauf les deux derniers instantanément retourné suivants:
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
Quelqu'un peut-il expliquer ce qui se passe? Comment puis-je améliorer les performances de la requête? Merci.
Maintenant, je suis fou, je n'ai pas pensé à ça, ça m'est arrivé à plusieurs reprises dans un environnement de travail lors de la mise en ligne. *secoue la tête*. Je suis content que vous l'ayez compris. – XstreamINsanity
Je vous suggère de prendre un grand cluebat avec vous. –