Oracle-SQL-Abfrage zu lange dauert, z.B. 60 Minuten zu führen

Ich habe eine Abfrage, die zu lange dauert, das sind 60 Minuten. Ich bin Programmierer, aber ich bin nicht ganz sicher, ob alle in der Tabelle sind die Indizes aus.

hier ist die Abfrage, eine Tabelle, die endet mit " _V " ist der Ansicht:

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 ;

Dies ist die Abfrage, die ich verwenden, um herauszufinden, ob einige der Tabelle sind index-oder nicht.

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';

Tut mir Leid ich bin Neuling in der Datenbank Sache. Ich weiß nur grundlegende Dinge wie sql join und schreiben einfache Anfragen. Jede Hilfe zu schätzen wissen. Ich bin mit Oracle SQL Developer.

kann jemand bitte leiten Sie mich, wenn ich etwas falsch? Ich würde es zu schätzen wissen.

UPDATE:
Ich sah dieses video auf, wie Sie ausführen "erklären, planen' und hier ist, was ich bekam, Ergebnis

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')
  • Zeigen Sie uns den Ausführungsplan.
  • ich bin nicht sicher, was u bedeuten? Ich ging durch jede Abfrage in der Ansicht und prüfen Sie, ob es indiziert wird oder nicht? aber ich bin verwirrt, was ist der Unterschied zwischen dba_indexes und user_indexes
  • Indizes, die nicht zur Erhöhung der Leistung Ihrer Anwendung magisch, Oracle nicht benutzen, wenn die Art und Weise, ohne den index schneller ist. Zuerst müssen Sie sammeln die Statistik, zweitens generieren Sie eine explain plan, schließlich, zeigen, wird die explain-plan
  • die Wörter explain plan for bevor Sie Ihre Abfrage ausführen und Bearbeiten Sie Ihre Frage mit der daraus resultierenden Tabelle.
  • Ich denke, es ist nicht genug, ich denke, der Autor hat sich nicht versammelt, alle Statistiken auf allen. Und beim ausführen der explain plan for... verwenden Sie DBMS_XPLAN zu bekommen, der plan.
  • Angesichts seiner vorherigen Kommentar hast du wohl Recht.
  • Es tut mir Leid ich bin Neuling in der Datenbank Sache. Ich weiß nur grundlegende Dinge wie sql join und schreiben einfache Anfragen. Jede Hilfe zu schätzen wissen.
  • Sie können lernen, zu erklären, Pläne und wie Sie hier für 11g, docs.oracle.com/cd/E11882_01/server.112/e41573/....
  • Aktualisiert mit den Ausführungsplan, bitte Lesen Sie meine original post.
  • Haben Sie Statistik erfasst? Ich sehe nichts, dass Schäden, die Ihre Leistung
  • Ich bin nicht sicher, wie zu tun ist - Statistik erfasst ? können Sie bitte führe mich oder zeigen mir, wie es zu tun? Ich bin glücklich, Informationen zu liefern, um zu zwicken, die sql-Abfrage nicht viel Zeit.
  • ok, one more time http://www.dba-oracle.com/concepts/tables_optimizer_statistics.htm
  • welche Sie wie Sie mich zu führen? 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', 'MITARBEITER'); exec dbms_stats.gather_index_stats('SCOTT', 'EMPLOYEES_PK'); exec dbms_stats.delete_schema_stats('SCOTT'); nach dem ausführen ein, sehe ich dieses Ergebnis aber nichts passieren --> anonymer block abgeschlossen
  • führen Sie diese dbms_stats.gather_table_stats('SCHEMA_OR_USER_WHO_IS_OWNER_OF_THE_TABLES', 'TABLE_NAME_IN_CAPITAL_CASE'); für jede Ihrer Tabellen. Ich nehme an, der Besitzer/Benutzer/schema AMD_OARS verwenden.
  • wenn ich diese lief --> exec dbms_stats.gather_table_stats('AMD_OARS', 'TEMP_SELECTED_PRODUCT'); ich habe dieses Ergebnis --> anonymer block abgeschlossen
  • Lassen Sie uns weiter, diese Diskussion im chat.

InformationsquelleAutor jimagic | 2014-08-15
Schreibe einen Kommentar