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?
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
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
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