2010-12-01 3 views
3

J'ai une requête:tuning SQL question

select count(1) CNT 
from file_load_params a 
where a.doc_type = (select b.doc_type 
        from file_load_header b 
        where b.indicator = 'XELFASI') 
order by a.line_no 

qui expliquent le plan est:

----------------------------------------------------------------------------------------------------- 
| Id | Operation      | Name    | Rows | Bytes | Cost (%CPU)| Time  | 
----------------------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT    |      |  1 |  7 |  3 (0)| 00:00:01 | 
| 1 | SORT AGGREGATE    |      |  1 |  7 |   |   | 
|* 2 | TABLE ACCESS FULL   | FILE_LOAD_PARAMS | 15 | 105 |  2 (0)| 00:00:01 | 
| 3 | TABLE ACCESS BY INDEX ROWID| FILE_LOAD_HEADER |  1 | 12 |  1 (0)| 00:00:01 | 
|* 4 |  INDEX UNIQUE SCAN   | FILE_LOAD_HEADER_UK |  1 |  |  0 (0)| 00:00:01 | 
----------------------------------------------------------------------------------------------------- 

Je pensais que je pouvais optimiser cette requête et écrire celui-ci:

select count(1) CNT 
from file_load_params a,file_load_header b 
where b.indicator = 'XELFASI' 
and a.doc_type = b.doc_type 
order by a.line_no 

Son plan d'explication est:

----------------------------------------------------------------------------------------------------- 
| Id | Operation      | Name    | Rows | Bytes | Cost (%CPU)| Time  | 
----------------------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT    |      |  1 | 19 |  3 (0)| 00:00:01 | 
| 1 | SORT AGGREGATE    |      |  1 | 19 |   |   | 
| 2 | NESTED LOOPS    |      | 15 | 285 |  3 (0)| 00:00:01 | 
| 3 | TABLE ACCESS BY INDEX ROWID| FILE_LOAD_HEADER |  1 | 12 |  1 (0)| 00:00:01 | 
|* 4 |  INDEX UNIQUE SCAN   | FILE_LOAD_HEADER_UK |  1 |  |  0 (0)| 00:00:01 | 
|* 5 | TABLE ACCESS FULL   | FILE_LOAD_PARAMS | 15 | 105 |  2 (0)| 00:00:01 | 
----------------------------------------------------------------------------------------------------- 

Est-ce bon? Je ne pense pas, mais je m'attendais à un meilleur résultat ... Avez-vous une idée?

Répondre

2

Une des optimisations possibles que je vois de votre plan expliquer est

TABLE ACCESS FULL   | FILE_LOAD_PARAMS 

Cela semble indiquer que la table file_load_params ne peut-être pas un indice sur doc_type

Si tel est le cas, pouvez-vous ajoutez un index pour doc_type. Si vous avez déjà des index, pouvez-vous poster votre schéma de table pour file_load_params

+0

Oui, il a index sur doc_type mais quand je suggère d'utiliser les augmentations de coûts malheureusement, mais je sais pourquoi, parce que les enregistrements dans cette table est juste 30..So en utilisant index sur la table avec quelques enregistrements n'est pas bon choix. – kupa

+0

En édition: un index unique appelé "FILE_LOAD_PARAMS_PK" est créé sur la table "file_load_params" qui est complexe et contient des colonnes (DOC_TYPE, PARAM). – kupa

+1

@kupa - est 30 ou quelque chose dans cette gamme - le nombre attendu d'enregistrements pour cette table? Si c'est le cas, l'analyse complète de la table n'est même pas un problème. Autre que de supprimer la commande par (comme vous faites un compte en tout cas), je ne pense pas qu'il y ait une autre optimisation vraiment nécessaire à ce stade. Combien de temps prend votre requête pour l'exécuter actuellement? – InSane

1

Le résultat n'est pas le même pour les deux requêtes. L'opérateur IN applique automatiquement un DISTINCT à la requête interne. Et dans ce cas, ce n'est probablement pas une clé sur laquelle vous vous connectez (si c'est le cas, alors faites-en une clé unique), donc elle ne peut pas être optimisée.

En ce qui concerne l'optimisation de la requête, puis faire comme le dit Insane, ajouter un index sur Doc_Type dans FILE_LOAD_PARAMS

3

De Explain plans, ceux-ci semblent être minuscules tables et le coût de la requête est négligeable. Combien de temps prennent-ils pour courir et à quelle vitesse avez-vous besoin d'eux pour courir?

Mais supprimez l'ORDER BY. Puisque vous sélectionnez une seule ligne COUNT, elle est inutile.

+0

Oui, ce sont des tables minuscules, c'est pourquoi je ne peux pas identifier quel sql est meilleur.Merci pour votre conseil pour supprimer l'ordre par clause ça a vraiment amélioré cette requête:):) (Coût maintenant 2) C'est marrant que je ne l'aie pas remarqué jusqu'ici: DI recherche sqls (en particulier top sqls) dans ma base de données exécuté par d'autres utilisateurs et ma tâche est de les optimiser autant que possible il y a beaucoup de sqls ... Et je cherche le moyen d'optimiser, de quoi parler et ainsi de suite. – kupa