0

Je travaille sur une tâche d'optimisation de requête et j'ai un ensemble de requêtes qui sont utilisées par mon application et supporte tous (Oracle, Ms Sql Server et MySQL).Je ne suis pas capable d'obtenir des performances même après avoir créé des index composites et simples (carte normale et Bit)

Ma structure de table:

User_Info { 
id    int primary key 
user_name  String  /*can have duplicate names*/ 
modified_date date   /*can have duplicate dates*/ 
action   String  /*have some set of pre-defined actions only*/ 
url    String  /*have maximum number of uniqueness*/ 

} 

Mais maintenant la taille de ce tableau a été augmenté à 7 millions de dossiers.

Ci-dessous le nombre d'enregistrements en double pour certaines des colonnes qui sont utilisés dans la requête:

  • user_name: john a 5 692 214 doublons et
  • l'action: Actions1 a 5 812 590 doubles et 194 999 actions2 a des doubles

et toutes les requêtes (combinaison de ceux-ci: user_name, action, mod ified_date et url colonnes peuvent être utilisés dans la requête) sont juste retour le nombre de toutes les lignes et toutes les colonnes à l'aide Pagination:

Exemple de ma requête:

select * from (
select info.*,ROW_NUMBER() OVER(order by info.modified_date DESC) rn from (
select info.*, Count(*) OVER() AS info_count from (
select * from User_Info info where (info.url LIKE 'url://%') AND (info.action = 'Action1') AND info.user_name ='john' and info.modified_date >= '04/01/2014 00:00:00' and info.modified_date <= '04/12/2014 23:59:59' 
) info 
) info 
) info 
WHERE rn >= 1 and rn <=100; 

mais le problème est, ils le tout prend environ 100 sec. J'ai essayé de créer tous les types possibles d'index combinés et simples et j'ai essayé toutes les solutions possibles. Il est amélioré après l'ajout d'index mais pas au niveau satisfaisant

J'ai besoin de toutes les requêtes pour compléter en max. 10 secondes

Les indices actuels sont que j'essayées:

CREATE INDEX INX_USER_INFO_D4 ON USER_INFO(MODIFIED_DATE DESC, USER_NAME, URL, ACTION) COMPRESS; 
CREATE INDEX INX_USER_INFO_U2 ON USER_INFO(USER_NAME, ACTION) COMPRESS; 
CREATE INDEX INX_USER_INFO_DATED ON USER_INFO(MODIFIED) COMPRESS; 

Comment puis-je concevoir mes index afin qu'il puisse couvrir de la performance tout scénario?

+0

Veuillez exécuter 'EXPLAIN PLAN SELECT un-reste-de-votre-requête', puis' SELECT * FROM table (DBMS_XPLAN.Display'), puis copier un résultat de la dernière requête et l'ajouter à la question au format texte (utilisez l'option EDIT) .Plus sur la commande 'explain plan' vous pouvez trouver [ici] (https://docs.oracle.com/cd/B19306_01/server.102/b14211/ex_plan.htm#g42231) – krokodilko

+0

merci pour le lien @krokodilko, j'ai déjà essayé cette option mais je ne sais pas si elle montre le résultat correct à chaque fois. – Krishna

+0

Avez-vous essayé des index sur USER_INFO (ACTION, USER_NAME MODIFIED_DATE DESC) ou USER_INFO (ACTION, USER_NAME, URL, MODIFIED_DATE DESC)? – krokodilko

Répondre

0

Pour cette requête concrète:

select * 
from (
    select info.*,ROW_NUMBER() OVER(order by info.modified_date DESC) rn 
    from (
     select info.*, Count(*) OVER() AS info_count 
     from (
      select * from User_Info info 
      where 
       (info.url LIKE 'url://%') 
      AND (info.action = 'Action1') 
      AND info.user_name ='john' 
      and info.modified_date >= '04/01/2014 00:00:00' 
      and info.modified_date <= '04/12/2014 23:59:59' 
    ) info 
    ) info 
) info 
WHERE rn >= 1 and rn <=100; 

dans mon propre devinette, sans voir un expliquer le plan de cette requête, à la recherche uniquement sur la requête et la structure de la table, les meilleurs résultats peuvent (ou ne peut pas) donner un index multicolonne sur info(action , user_name, modified_date).
Veuillez créer cet index, puis actualiser les statistiques, puis générer le plan d'explication et mesurer une heure de requête, et nous verrons.
L'optimiseur peut utiliser cet index, mais peut l'ignorer également, personne ne le sait.