Oracle SQL de la requête en prenant trop de temps comme 60 minutes pour exécuter

J'ai une requête qui prend trop de temps, qui est de 60 minutes. Je suis programmeur, mais je ne suis pas tout à fait sûr si toute la table sont indexes.

voici la requête, une table qui se termine avec _V est vue:

SELECT prod_eff.facility
     , prod_eff.product
     , (SELECT MIN (cbv1.bucket_header) 
          FROM AMD_OARS.CURRENT_BUCKETS_V cbv1
         WHERE cbv1.version_id  = 1
           AND cbv1.min_datetime >= prod_eff.EFF_START_DATETIME
       ) min_eff
     , (SELECT MAX (cbv1.bucket_header)
          FROM AMD_OARS.CURRENT_BUCKETS_V cbv1
         WHERE cbv1.version_id = 1
           AND cbv1.min_datetime < prod_eff.EFF_END_DATETIME
       ) max_eff
     , 1 valid
  FROM (
        SELECT pf.product
             , pf.facility
             , pf.eff_start_datetime
             , pf.eff_end_datetime
          FROM AMD_OARS.BOM_PRODUCT_FACILITY pf
             , AMD_OARS.MASTER_FACILITY f
         WHERE pf.version_id = 114847
           AND pf.facility     = f.facility
           AND f.facility     != 'NONE'
           AND f.validated     = 1
       ) prod_eff
     , AMD_OARS.TEMP_SELECTED_PRODUCT tsp
 WHERE tsp.product = prod_eff.product
   AND (prod_eff.EFF_START_DATETIME BETWEEN 
            to_timestamp('07/27/2014 00:00:01.000', 'mm/dd/yyyy hh24:mi:ss.ff3') AND 
            to_timestamp('12/20/2015 00:00:00.000', 'mm/dd/yyyy  hh24:mi:ss.ff3') OR 
        prod_eff.EFF_END_DATETIME BETWEEN 
            to_timestamp('07/27/2014 00:00:01.000', 'mm/dd/yyyy hh24:mi:ss.ff3') AND 
            to_timestamp('12/20/2015 00:00:00.000', 'mm/dd/yyyy hh24:mi:ss.ff3') 
       )
 ORDER BY 1, 2, 3, 4 ;

C'est la requête que j'utilise pour savoir si certains de la table d'index sont ou pas.

select table_name 
from dba_tables 
where (owner, table_name) not in (select table_owner, table_name from dba_indexes)
and table_name = 'TEMP_SELECTED_PRODUCT';

Je suis désolé, je suis novice dans la base de données de chose. Je ne connais que de base, comme jointure sql et l'écriture des requêtes de base. Toute aide sera apprécier. Je suis à l'aide de Oracle SQL Developer.

quelqu'un peut-il svp me guider si je fais quelque chose de mal? Je l'apprécierais.

Mise à JOUR:
J'ai vu cette vidéo sur la façon d'exécuter 'expliquer le plan de" et voici ce que j'ai obtenu le résultat

Plan hash value: 1792060973
-------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name                 | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                      |     1 |    78 |     4  (25)| 00:00:01 |
|   1 |  SORT AGGREGATE                |                      |     1 |    66 |            |          |
|*  2 |   TABLE ACCESS BY INDEX ROWID  | TEMP_CURRENT_BUCKETS |     1 |    66 |     1   (0)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN            | TCB_PK               |     1 |       |     1   (0)| 00:00:01 |
|   4 |  SORT AGGREGATE                |                      |     1 |    66 |            |          |
|*  5 |   TABLE ACCESS BY INDEX ROWID  | TEMP_CURRENT_BUCKETS |     1 |    66 |     1   (0)| 00:00:01 |
|*  6 |    INDEX RANGE SCAN            | TCB_PK               |     1 |       |     1   (0)| 00:00:01 |
|   7 |  SORT ORDER BY                 |                      |     1 |    78 |     4  (25)| 00:00:01 |
|   8 |   NESTED LOOPS                 |                      |     1 |    78 |     3   (0)| 00:00:01 |
|   9 |    NESTED LOOPS                |                      |     1 |    69 |     2   (0)| 00:00:01 |
|  10 |     INDEX FULL SCAN            | TSP_PK               |     1 |    18 |     1   (0)| 00:00:01 |
|* 11 |     TABLE ACCESS BY INDEX ROWID| BOM_PRODUCT_FACILITY |     1 |    51 |     1   (0)| 00:00:01 |
|* 12 |      INDEX RANGE SCAN          | BPF_PK               |     1 |       |     1   (0)| 00:00:01 |
|* 13 |    TABLE ACCESS BY INDEX ROWID | MASTER_FACILITY      |     1 |     9 |     1   (0)| 00:00:01 |
|* 14 |     INDEX UNIQUE SCAN          | MF_F_PK              |     1 |       |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("CB"."MIN_DATETIME">=:B1)
3 - access("CB"."VERSION_ID"=1)
5 - filter("CB"."MIN_DATETIME"<:B1)
6 - access("CB"."VERSION_ID"=1)
11 - filter(INTERNAL_FUNCTION("PF"."EFF_START_DATETIME")>=TIMESTAMP' 2014-07-27 
00:00:01.000000000' AND INTERNAL_FUNCTION("PF"."EFF_START_DATETIME")<=TIMESTAMP' 2015-12-20 
00:00:00.000000000' OR INTERNAL_FUNCTION("PF"."EFF_END_DATETIME")>=TIMESTAMP' 2014-07-27 
00:00:01.000000000' AND INTERNAL_FUNCTION("PF"."EFF_END_DATETIME")<=TIMESTAMP' 2015-12-20 
00:00:00.000000000')
12 - access("PF"."VERSION_ID"=114847 AND "TSP"."PRODUCT"="PF"."PRODUCT")
filter("TSP"."PRODUCT"="PF"."PRODUCT" AND "PF"."FACILITY"<>'NONE')
13 - filter("F"."VALIDATED"=1)
14 - access("PF"."FACILITY"="F"."FACILITY")
filter("F"."FACILITY"<>'NONE')
  • Nous montrer le plan d'exécution.
  • je ne suis pas sûr de ce que u veux dire? Je suis passé par chaque requête à l'intérieur de la vue et de vérifier si elle est indexée ou non? mais je ne sais pas quelle est la différence entre dba_indexes et user_indexes
  • Les indices de ne pas augmenter les performances de votre application comme par magie, Oracle ne l'utilisez pas si le chemin sans l'index est plus rapide. Tout d'abord, vous devez réunir les statistiques, d'autre part de générer un expliquer le plan, enfin, montrer, c'est le plan d'expliquer
  • mettre les mots explain plan for avant votre requête ,de l'exécuter et de modifier votre question avec le tableau résultant.
  • Je suppose que c'est pas assez, je pense que l'auteur n'a pas recueilli des statistiques à tous. Et lorsque vous exécutez la explain plan for... vous devez utiliser DBMS_XPLAN pour obtenir le plan.
  • Compte tenu de son observation précédente, vous avez probablement raison.
  • Je suis désolé, je suis novice dans la base de données de chose. Je ne connais que de base, comme jointure sql et l'écriture des requêtes de base. Toute aide sera apprécier.
  • vous pouvez en apprendre davantage sur plans d'explication et comment le faire ici pour 11g, docs.oracle.com/cd/E11882_01/server.112/e41573/....
  • Mis à jour avec le plan d'exécution, veuillez voir mon post original.
  • Avez-vous recueilli des statistiques? Je ne vois rien que des dommages à votre performance
  • Je ne suis pas sûr de la façon de le faire - a rassemblé des statistiques ? pouvez-vous svp me guider ou m'indiquer comment faire? Je suis heureux de fournir des informations afin de tordre de requête sql pour ne pas prendre beaucoup de temps.
  • ok, une fois de plus http://www.dba-oracle.com/concepts/tables_optimizer_statistics.htm
  • celui qui vous plaît le moi de courir? exec dbms_stats.gather_schema_stats('SCOTT',DBMS_STATS.AUTO_SAMPLE_SIZE); exec dbms_stats.gather_schema_stats(ownname=>'SCOTT', estimate_percent=>DBMS_STATS.AUTO_SAMPLE_SIZE); exec dbms_stats.gather_schema_stats(ownname => 'SCOTT', estimate_percent => 25); exec dbms_stats.gather_table_stats ("SCOTT", "EMPLOYÉS"); exec dbms_stats.gather_index_stats('SCOTT', 'EMPLOYEES_PK'); exec dbms_stats.delete_schema_stats('SCOTT'); après l'exécution de l'un, je vois ce résultat, mais rien ne se passe --> bloc anonyme terminé
  • l'exécution de cette dbms_stats.gather_table_stats('SCHEMA_OR_USER_WHO_IS_OWNER_OF_THE_TABLES', 'TABLE_NAME_IN_CAPITAL_CASE'); pour chacune de vos tables. Je suppose que le propriétaire/utilisateur/schéma est AMD_OARS l'utiliser.
  • quand j'ai couru ce --> exec dbms_stats.gather_table_stats('AMD_OARS', 'TEMP_SELECTED_PRODUCT'); j'ai obtenu ce résultat --> bloc anonyme terminé
  • Laissez-nous continuer cette discussion dans le chat.

InformationsquelleAutor jimagic | 2014-08-15