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