SQL Monster SQL zum Optimieren

Micha1701

Cadet 4th Year
Registriert
März 2007
Beiträge
113
Hallo zusammen,

hab mal was für die richtigen Experten unter uns.
Hier ein Monster SQL welches im SAP System unter Oracle laufen soll.
Die Laufzeit liegt jenseits von 30 Stunden. Wäre schön, wenn man das auf unter 8 Stunden kriegen würde.

Code:
WITH
versobj_par_bez 	AS (SELECT insobject, partner, insobjecttyp, partneracc,
                          		z_vstatus, z_vo_rd, z_gp_nr_vn, z_status_gm,
                          		pkey, pp_from
                       		FROM dimaiobpar
                      		 WHERE z_vstatus IN ('10', '11', '30') AND
                             		insobjecttyp IN ( '11', '12', '13', '21',            
                                		              '22', '23', '24', '25',
                                     	 	          '40', '42', '43', '50',            
                                    		          '60', '75', '77', '78')),

vkont_distinct 		AS (SELECT partneracc AS vkont
                    		FROM versobj_par_bez
                    		GROUP BY partneracc),

vertragskonto 		AS (SELECT fkkvk.vkont, fkkvk.vkona, fkkvk.vktyp
                			FROM fkkvk, vkont_distinct
                			WHERE fkkvk.vkont = vkont_distinct.vkont AND
                      				fkkvk.vktyp IN ('10', '27', '50', '60', '75', '80')),

vkont_par_distinct 	AS (SELECT partneracc as vkont, partner
                        	FROM versobj_par_bez
                        	GROUP BY partneracc, partner),

ezw 				AS (SELECT fkkvkp.vkont, fkkvkp.gpart, fkkvkp.ezawe 
            				FROM fkkvkp, vkont_par_distinct
            				WHERE fkkvkp.vkont = vkont_par_distinct.vkont AND
                  					fkkvkp.gpart = vkont_par_distinct.partner),
sperre                  AS (SELECT dfkklocks.gpart, dfkklocks.vkont, dfkklocks.lockr
                                FROM dfkklocks, vkont_par_distinct
                                WHERE lockr = 'M' AND
                                      fdate <= '20130101' AND /*pa_stat*/
                                      tdate >= '20130101' AND /*pa_stat*/
                                      gpart = partner AND
                                      dfkklocks.vkont = vkont_par_distinct.vkont),
                                      
zahlplan_alle           AS (SELECT dimaparpplan.insobject, dimaparpplan.partner, dimaparpplan.pp_from, dimaparpplan.pp_from_time,
                                   dimaparpplan.pkey
                                FROM dimaparpplan, versobj_par_bez
                                WHERE dimaparpplan.insobject = versobj_par_bez.insobject AND
                                      dimaparpplan.partner = versobj_par_bez.partner),

zahlplan_datum_tab     AS (SELECT insobject, partner, MAX(pp_from) AS pp_from
                                FROM zahlplan_alle
                                GROUP BY insobject, partner),
                                
zahlplan_datum_uhrzeit_tab AS (SELECT zahlplan_alle.insobject, zahlplan_alle.partner, zahlplan_alle.pp_from, 
                                        MAX(zahlplan_alle.pp_from_time) as pp_from_time
                                   FROM zahlplan_alle, zahlplan_datum_tab
                                   WHERE zahlplan_alle.insobject = zahlplan_datum_tab.insobject AND
                                         zahlplan_alle.partner = zahlplan_datum_tab.partner AND
                                         zahlplan_alle.pp_from = zahlplan_datum_tab.pp_from
                                   GROUP BY zahlplan_alle.insobject, zahlplan_alle.partner, zahlplan_alle.pp_from),
                                   
zahlplan_relevant      AS (SELECT zahlplan_alle.insobject, zahlplan_alle.partner, zahlplan_alle.pp_from,
                                  zahlplan_alle.pkey
                                FROM zahlplan_alle, zahlplan_datum_uhrzeit_tab
                                WHERE zahlplan_alle.insobject = zahlplan_datum_uhrzeit_tab.insobject AND
                                      zahlplan_alle.partner = zahlplan_datum_uhrzeit_tab.partner AND
                                      zahlplan_alle.pp_from = zahlplan_datum_uhrzeit_tab.pp_from AND
                                      zahlplan_alle.pp_from_time = zahlplan_datum_uhrzeit_tab.pp_from_time),

zahlplanpos            AS (SELECT 'X' AS zpp_vorhanden, gpart, vtref, prgrp, posnr, psngl, pmtfr, pmtto, pmend, zzendegrund,
                                  amount_total, amount_inst, hvorg, tvorg, zzdokart, zztech_begin, ccode, zztimestamp
                               FROM vvscpos, versobj_par_bez
                               WHERE gpart = partner AND
                                     vtref = insobject AND
                                     hvorg = '1000' AND
                                     (tvorg = '0100' OR tvorg = '0110') AND
                                     blart = '10' AND
                                     ((pmtfr >= '20120101' AND pmtfr <= '20190101') OR /* PA_ZPVON, PA_ZPBIS */
                                      (pmtto >= '20120101' AND pmtto <= '20190101') OR /* PA_ZPVON, PA_ZPBIS */
                                      (pmend >= '20120101' AND pmend <= '20190101') OR /* PA_ZPVON, PA_ZPBIS */
                                      (pmtfr <= '20120101' AND pmtto >= '20190101' AND /* PA_ZPVON, PA_ZPBIS */
                                       (pmend = '00000000' OR pmend >= '20120101'))))  /* fix, PA_ZPVON */
                                     
SELECT versobj_par_bez.insobject, 
		versobj_par_bez.partner,
		versobj_par_bez.insobjecttyp,
		versobj_par_bez.partneracc,
		versobj_par_bez.z_vstatus,
		versobj_par_bez.z_vo_rd,
		versobj_par_bez.z_gp_nr_vn,
		versobj_par_bez.z_status_gm,
		versobj_par_bez.pkey,
		versobj_par_bez.pp_from,
		vertragskonto.vkona,
		vertragskonto.vktyp,
	      ezw.ezawe,
            sperre.lockr,
            zahlplan_relevant.pp_from as zahlplan_pp_from,
            zahlplan_relevant.pkey as zahlplan_pkey,
            zahlplanpos.zpp_vorhanden,
            zahlplanpos.prgrp,
            zahlplanpos.posnr,
            zahlplanpos.psngl,
            zahlplanpos.pmtfr,
            zahlplanpos.pmtto,
            zahlplanpos.pmend,
            zahlplanpos.zzendegrund,
            zahlplanpos.amount_total,
            zahlplanpos.amount_inst,
            zahlplanpos.hvorg,
            zahlplanpos.tvorg,
            zahlplanpos.zzdokart,
            zahlplanpos.zztech_begin,
            zahlplanpos.ccode,
            zahlplanpos.zztimestamp
    FROM versobj_par_bez 
	JOIN vertragskonto 
		ON versobj_par_bez.partneracc = vertragskonto.vkont 
	LEFT OUTER JOIN ezw 
		ON versobj_par_bez.partneracc = ezw.vkont AND
 	         versobj_par_bez.partner = ezw.gpart
      LEFT OUTER JOIN sperre
            ON versobj_par_bez.partneracc = sperre.vkont AND
               versobj_par_bez.partner = sperre.gpart
      LEFT OUTER JOIN zahlplan_relevant
            ON versobj_par_bez.insobject = zahlplan_relevant.insobject AND
               versobj_par_bez.partner = zahlplan_relevant.partner
      LEFT OUTER JOIN zahlplanpos
            ON versobj_par_bez.insobject = zahlplanpos.vtref AND
               versobj_par_bez.partner = zahlplanpos.gpart
    ORDER BY versobj_par_bez.insobject, versobj_par_bez.partner

Hier mal die Größen der Tabellen:
DIMAIOBPAR - 16.639.094 Zeilen (relevant 10.538.624)
FKKVK - 8.786.755 Zeilen (relevant min. 6.155.081)
FKKVP - 8.786.755 Zeilen (relevant wahrscheinlich 6.155.081)
DFKKLOCKS - 816.131 Zeilen (relevant 2.461)
DIMAPARPLAN - 10.934.171 Zeilen (unbekannte relevants wahrscheinlich ~8.000.000)
VVSCPOS - 66.009.792 zeilen (relevant max. 42.217.773)

Könnt Ihr nochwas gebrauchen? Ich könnt noch ein EXPLAIN mitgeben...
 
Hast du mal ein DESCRIBE/EXPLAIN vor die Query gesetzt und geschaut, ob überall mit einem entsprechenden Index gearbeitet wird?
Edit: sehe ich gerade, ja bitte den EXPLAIN mal angeben.

Gerade Subselects wie in diesem Fall schmeißen diesen (zumindest bei MySQL) einfach raus.
Dort müsste man dann mit Temp. Tables arbeiten und den Index manuell nachziehen.
 
Und hier das EXPLAIN

Code:
Execution Plan

---------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name                        | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |                             |  9070K|  4117M|       |  2183K  (1)| 10:18:31 |
|   1 |  TEMP TABLE TRANSFORMATION          |                             |       |       |       |            |          |
|   2 |   LOAD AS SELECT                    | SYS_TEMP_0FD9D6664_110D1849 |       |       |       |            |          |
|*  3 |    TABLE ACCESS FULL                | DIMAIOBPAR                  |  6046K|   438M|       |   105K  (2)| 00:29:47 |
|   4 |   LOAD AS SELECT                    | SYS_TEMP_0FD9D6665_110D1849 |       |       |       |            |          |
|   5 |    HASH GROUP BY                    |                             |  6046K|   138M|   185M| 48419   (1)| 00:13:44 |
|   6 |     VIEW                            |                             |  6046K|   138M|       | 11095   (1)| 00:03:09 |
|   7 |      TABLE ACCESS FULL              | SYS_TEMP_0FD9D6664_110D1849 |  6046K|   438M|       | 11094   (1)| 00:03:09 |
|   8 |   LOAD AS SELECT                    | SYS_TEMP_0FD9D6666_110D1849 |       |       |       |            |          |
|*  9 |    HASH JOIN                        |                             |  6046K|   472M|   247M| 55977   (1)| 00:15:52 |
|  10 |     VIEW                            |                             |  6046K|   178M|       | 11095   (1)| 00:03:09 |
|  11 |      TABLE ACCESS FULL              | SYS_TEMP_0FD9D6664_110D1849 |  6046K|   438M|       | 11094   (1)| 00:03:09 |
|  12 |     TABLE ACCESS FULL               | DIMAPARPPLAN                |    10M|   513M|       | 24621   (1)| 00:06:59 |
|  13 |   SORT ORDER BY                     |                             |  9070K|  4117M|  4428M|  1973K  (1)| 09:19:10 |
|* 14 |    HASH JOIN RIGHT OUTER            |                             |  9070K|  4117M|       |  1170K  (1)| 05:31:37 |
|  15 |     VIEW                            |                             |  4567 |   227K|       |   121K  (1)| 00:34:24 |
|* 16 |      HASH JOIN                      |                             |  4567 |   682K|       |   121K  (1)| 00:34:24 |
|  17 |       VIEW                          |                             |  9134 |   660K|       |   106K  (1)| 00:30:16 |
|  18 |        HASH GROUP BY                |                             |  9134 |   874K|   984K|   106K  (1)| 00:30:16 |
|* 19 |         HASH JOIN                   |                             |  9134 |   874K|   334M|   106K  (1)| 00:30:13 |
|  20 |          VIEW                       |                             |  6046K|   265M|       | 75928   (1)| 00:21:31 |
|  21 |           HASH GROUP BY             |                             |  6046K|   265M|   325M| 75928   (1)| 00:21:31 |
|  22 |            VIEW                     |                             |  6046K|   265M|       | 14550   (1)| 00:04:08 |
|  23 |             TABLE ACCESS FULL       | SYS_TEMP_0FD9D6666_110D1849 |  6046K|   294M|       | 14549   (1)| 00:04:08 |
|  24 |          VIEW                       |                             |  6046K|   299M|       | 14550   (1)| 00:04:08 |
|  25 |           TABLE ACCESS FULL         | SYS_TEMP_0FD9D6666_110D1849 |  6046K|   294M|       | 14549   (1)| 00:04:08 |
|  26 |       VIEW                          |                             |  6046K|   455M|       | 14550   (1)| 00:04:08 |
|  27 |        TABLE ACCESS FULL            | SYS_TEMP_0FD9D6666_110D1849 |  6046K|   294M|       | 14549   (1)| 00:04:08 |
|* 28 |     HASH JOIN RIGHT OUTER           |                             |  9070K|  3676M|       |  1048K  (1)| 04:57:13 |
|  29 |      VIEW                           |                             | 49158 |  1296K|       | 10460   (1)| 00:02:58 |
|* 30 |       HASH JOIN                     |                             | 49158 |  3888K|  2696K| 10460   (1)| 00:02:58 |
|* 31 |        INDEX FAST FULL SCAN         | DFKKLOCKS~0                 | 49158 |  2112K|       |   376   (1)| 00:00:07 |
|  32 |        VIEW                         |                             |  6046K|   213M|       |  3521   (2)| 00:01:00 |
|  33 |         TABLE ACCESS FULL           | SYS_TEMP_0FD9D6665_110D1849 |  6046K|   138M|       |  3520   (2)| 00:01:00 |
|* 34 |      HASH JOIN RIGHT OUTER          |                             |  9070K|  3442M|       |  1038K  (1)| 04:54:14 |
|  35 |       VIEW                          |                             |    94 | 20774 |       |   774K  (1)| 03:39:30 |
|  36 |        CONCATENATION                |                             |       |       |       |            |          |
|* 37 |         HASH JOIN                   |                             |    91 | 15015 |       |   162K  (1)| 00:45:58 |
|* 38 |          TABLE ACCESS BY INDEX ROWID| VVSCPOS                     |    91 | 12194 |       |   151K  (1)| 00:42:49 |
|* 39 |           INDEX SKIP SCAN           | VVSCPOS~Z01                 | 69702 |       |       |   143K  (1)| 00:40:41 |
|  40 |          VIEW                       |                             |  6046K|   178M|       | 11095   (1)| 00:03:09 |
|  41 |           TABLE ACCESS FULL         | SYS_TEMP_0FD9D6664_110D1849 |  6046K|   438M|       | 11094   (1)| 00:03:09 |
|* 42 |         HASH JOIN                   |                             |     1 |   165 |       |   168K  (1)| 00:47:48 |
|* 43 |          TABLE ACCESS BY INDEX ROWID| VVSCPOS                     |   169 | 22646 |       |   157K  (1)| 00:44:39 |
|* 44 |           INDEX SKIP SCAN           | VVSCPOS~Z01                 |   129K|       |       |   143K  (1)| 00:40:41 |
|  45 |          VIEW                       |                             |  6046K|   178M|       | 11095   (1)| 00:03:09 |
|  46 |           TABLE ACCESS FULL         | SYS_TEMP_0FD9D6664_110D1849 |  6046K|   438M|       | 11094   (1)| 00:03:09 |
|* 47 |         HASH JOIN                   |                             |     1 |   165 |       |   195K  (1)| 00:55:26 |
|* 48 |          TABLE ACCESS BY INDEX ROWID| VVSCPOS                     |   494 | 66196 |       |   184K  (1)| 00:52:17 |
|* 49 |           INDEX SKIP SCAN           | VVSCPOS~Z01                 |   379K|       |       |   143K  (1)| 00:40:41 |
|  50 |          VIEW                       |                             |  6046K|   178M|       | 11095   (1)| 00:03:09 |
|  51 |           TABLE ACCESS FULL         | SYS_TEMP_0FD9D6664_110D1849 |  6046K|   438M|       | 11094   (1)| 00:03:09 |
|* 52 |         HASH JOIN                   |                             |     1 |   165 |       |   248K  (1)| 01:10:20 |
|* 53 |          TABLE ACCESS BY INDEX ROWID| VVSCPOS                     |  1128 |   147K|       |   237K  (1)| 01:07:11 |
|* 54 |           INDEX SKIP SCAN           | VVSCPOS~Z01                 |   866K|       |       |   143K  (1)| 00:40:41 |
|  55 |          VIEW                       |                             |  6046K|   178M|       | 11095   (1)| 00:03:09 |
|  56 |           TABLE ACCESS FULL         | SYS_TEMP_0FD9D6664_110D1849 |  6046K|   438M|       | 11094   (1)| 00:03:09 |
|* 57 |       HASH JOIN                     |                             |  9070K|  1531M|   355M|   263K  (1)| 01:14:44 |
|  58 |        VIEW                         |                             |  6005K|   286M|       |   115K  (1)| 00:32:50 |
|  59 |         HASH GROUP BY               |                             |  6005K|   303M|   344M|   115K  (1)| 00:32:50 |
|* 60 |          HASH JOIN                  |                             |  6005K|   303M|   144M| 46963   (1)| 00:13:19 |
|  61 |           VIEW                      |                             |  6046K|    74M|       | 11095   (1)| 00:03:09 |
|  62 |            TABLE ACCESS FULL        | SYS_TEMP_0FD9D6664_110D1849 |  6046K|   438M|       | 11094   (1)| 00:03:09 |
|* 63 |           TABLE ACCESS FULL         | FKKVK                       |  3975K|   151M|       | 27997   (1)| 00:07:56 |
|* 64 |        HASH JOIN RIGHT OUTER        |                             |  6046K|   732M|   224M|   121K  (1)| 00:34:23 |
|  65 |         VIEW                        |                             |  6046K|   155M|       | 90273   (1)| 00:25:35 |
|* 66 |          HASH JOIN                  |                             |  6046K|   363M|   282M| 90273   (1)| 00:25:35 |
|  67 |           VIEW                      |                             |  6046K|   213M|       |  3521   (2)| 00:01:00 |
|  68 |            TABLE ACCESS FULL        | SYS_TEMP_0FD9D6665_110D1849 |  6046K|   138M|       |  3520   (2)| 00:01:00 |
|  69 |           TABLE ACCESS FULL         | FKKVKP                      |  8663K|   214M|       | 73022   (1)| 00:20:42 |
|  70 |         VIEW                        |                             |  6046K|   576M|       | 11095   (1)| 00:03:09 |
|  71 |          TABLE ACCESS FULL          | SYS_TEMP_0FD9D6664_110D1849 |  6046K|   438M|       | 11094   (1)| 00:03:09 |
---------------------------------------------------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$D76EDF28
   2 - SEL$10
   3 - SEL$10       / DIMAIOBPAR@SEL$10
   4 - SEL$13
   6 - SEL$043F4C1A / VERSOBJ_PAR_BEZ@SEL$13
   7 - SEL$043F4C1A / T1@SEL$043F4C1A
   8 - SEL$16
  10 - SEL$043F4C19 / VERSOBJ_PAR_BEZ@SEL$16
  11 - SEL$043F4C19 / T1@SEL$043F4C19
  12 - SEL$16       / DIMAPARPPLAN@SEL$16
  15 - SEL$19       / ZAHLPLAN_RELEVANT@SEL$6
  16 - SEL$19
  17 - SEL$18       / ZAHLPLAN_DATUM_UHRZEIT_TAB@SEL$19
  18 - SEL$18
  20 - SEL$17       / ZAHLPLAN_DATUM_TAB@SEL$18
  21 - SEL$17
  22 - SEL$2B1E2309 / ZAHLPLAN_ALLE@SEL$17
  23 - SEL$2B1E2309 / T1@SEL$2B1E2309
  24 - SEL$2B1E2308 / ZAHLPLAN_ALLE@SEL$18
  25 - SEL$2B1E2308 / T1@SEL$2B1E2308
  26 - SEL$2B1E2307 / ZAHLPLAN_ALLE@SEL$19
  27 - SEL$2B1E2307 / T1@SEL$2B1E2307
  29 - SEL$15       / SPERRE@SEL$4
  30 - SEL$15
  31 - SEL$15       / DFKKLOCKS@SEL$15
  32 - SEL$23579EFB / VKONT_PAR_DISTINCT@SEL$15
  33 - SEL$23579EFB / T1@SEL$23579EFB
  35 - SEL$20       / ZAHLPLANPOS@SEL$8
  36 - SEL$20
  38 - SEL$20_1     / VVSCPOS@SEL$20
  39 - SEL$20_1     / VVSCPOS@SEL$20
  40 - SEL$043F4C18 / VERSOBJ_PAR_BEZ@SEL$20
  41 - SEL$043F4C18 / T1@SEL$043F4C18
  43 - SEL$20_2     / VVSCPOS@SEL$20_2
  44 - SEL$20_2     / VVSCPOS@SEL$20_2
  45 - SEL$043F4C18 / VERSOBJ_PAR_BEZ@SEL$20_2
  46 - SEL$043F4C18 / T1@SEL$043F4C18
  48 - SEL$20_3     / VVSCPOS@SEL$20_3
  49 - SEL$20_3     / VVSCPOS@SEL$20_3
  50 - SEL$043F4C18 / VERSOBJ_PAR_BEZ@SEL$20_3
  51 - SEL$043F4C18 / T1@SEL$043F4C18
  53 - SEL$20_4     / VVSCPOS@SEL$20_4
  54 - SEL$20_4     / VVSCPOS@SEL$20_4
  55 - SEL$043F4C18 / VERSOBJ_PAR_BEZ@SEL$20_4
  56 - SEL$043F4C18 / T1@SEL$043F4C18
  58 - SEL$6D9D21E0 / VERTRAGSKONTO@SEL$1
  59 - SEL$6D9D21E0
  61 - SEL$043F4C1B / VERSOBJ_PAR_BEZ@SEL$11
  62 - SEL$043F4C1B / T1@SEL$043F4C1B
  63 - SEL$6D9D21E0 / FKKVK@SEL$12
  65 - SEL$14       / EZW@SEL$2
  66 - SEL$14
  67 - SEL$23579EFC / VKONT_PAR_DISTINCT@SEL$14
  68 - SEL$23579EFC / T1@SEL$23579EFC
  69 - SEL$14       / FKKVKP@SEL$14
  70 - SEL$043F4C17 / VERSOBJ_PAR_BEZ@SEL$1
  71 - SEL$043F4C17 / T1@SEL$043F4C17

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - filter(("Z_VSTATUS"='10' OR "Z_VSTATUS"='11' OR "Z_VSTATUS"='30') AND ("INSOBJECTTYP"='11' OR
              "INSOBJECTTYP"='12' OR "INSOBJECTTYP"='13' OR "INSOBJECTTYP"='21' OR "INSOBJECTTYP"='22' OR "INSOBJECTTYP"='23' OR
              "INSOBJECTTYP"='24' OR "INSOBJECTTYP"='25' OR "INSOBJECTTYP"='40' OR "INSOBJECTTYP"='42' OR "INSOBJECTTYP"='43' OR
              "INSOBJECTTYP"='50' OR "INSOBJECTTYP"='60' OR "INSOBJECTTYP"='75' OR "INSOBJECTTYP"='77' OR "INSOBJECTTYP"='78'))
   9 - access("DIMAPARPPLAN"."INSOBJECT"="VERSOBJ_PAR_BEZ"."INSOBJECT" AND
              "DIMAPARPPLAN"."PARTNER"="VERSOBJ_PAR_BEZ"."PARTNER")
  14 - access("VERSOBJ_PAR_BEZ"."PARTNER"="ZAHLPLAN_RELEVANT"."PARTNER"(+) AND
              "VERSOBJ_PAR_BEZ"."INSOBJECT"="ZAHLPLAN_RELEVANT"."INSOBJECT"(+))
  16 - access("ZAHLPLAN_ALLE"."INSOBJECT"="ZAHLPLAN_DATUM_UHRZEIT_TAB"."INSOBJECT" AND
              "ZAHLPLAN_ALLE"."PARTNER"="ZAHLPLAN_DATUM_UHRZEIT_TAB"."PARTNER" AND
              "ZAHLPLAN_ALLE"."PP_FROM"="ZAHLPLAN_DATUM_UHRZEIT_TAB"."PP_FROM" AND
              "ZAHLPLAN_ALLE"."PP_FROM_TIME"="ZAHLPLAN_DATUM_UHRZEIT_TAB"."PP_FROM_TIME")
  19 - access("ZAHLPLAN_ALLE"."INSOBJECT"="ZAHLPLAN_DATUM_TAB"."INSOBJECT" AND
              "ZAHLPLAN_ALLE"."PARTNER"="ZAHLPLAN_DATUM_TAB"."PARTNER" AND
              "ZAHLPLAN_ALLE"."PP_FROM"="ZAHLPLAN_DATUM_TAB"."PP_FROM")
  28 - access("VERSOBJ_PAR_BEZ"."PARTNER"="SPERRE"."GPART"(+) AND
              "VERSOBJ_PAR_BEZ"."PARTNERACC"="SPERRE"."VKONT"(+))
  30 - access("GPART"="PARTNER" AND "DFKKLOCKS"."VKONT"="VKONT_PAR_DISTINCT"."VKONT")
  31 - filter("LOCKR"='M' AND "FDATE"<='20130101' AND "TDATE">='20130101')
  34 - access("VERSOBJ_PAR_BEZ"."PARTNER"="ZAHLPLANPOS"."GPART"(+) AND
              "VERSOBJ_PAR_BEZ"."INSOBJECT"="ZAHLPLANPOS"."VTREF"(+))
  37 - access("GPART"="PARTNER" AND "VTREF"="INSOBJECT")
  38 - filter("HVORG"='1000' AND "BLART"='10' AND ("TVORG"='0100' OR "TVORG"='0110'))
  39 - access("PMTTO">='20190101' AND "PMTFR"<='20120101')
       filter("PMTTO">='20190101' AND ("PMEND">='20120101' OR "PMEND"='00000000') AND "PMTFR"<='20120101')
  42 - access("GPART"="PARTNER" AND "VTREF"="INSOBJECT")
  43 - filter("HVORG"='1000' AND "BLART"='10' AND ("TVORG"='0100' OR "TVORG"='0110'))
  44 - access("PMTFR">='20120101' AND "PMTFR"<='20190101')
       filter("PMTFR">='20120101' AND "PMTFR"<='20190101' AND (LNNVL("PMTTO">='20190101') OR
              LNNVL("PMEND">='20120101') AND LNNVL("PMEND"='00000000') OR LNNVL("PMTFR"<='20120101')))
  47 - access("GPART"="PARTNER" AND "VTREF"="INSOBJECT")
  48 - filter("HVORG"='1000' AND "BLART"='10' AND ("TVORG"='0100' OR "TVORG"='0110'))
  49 - access("PMTTO">='20120101' AND "PMTTO"<='20190101')
       filter("PMTTO">='20120101' AND "PMTTO"<='20190101' AND (LNNVL("PMTFR">='20120101') OR
              LNNVL("PMTFR"<='20190101')) AND (LNNVL("PMTTO">='20190101') OR LNNVL("PMEND">='20120101') AND
              LNNVL("PMEND"='00000000') OR LNNVL("PMTFR"<='20120101')))
  52 - access("GPART"="PARTNER" AND "VTREF"="INSOBJECT")
  53 - filter("HVORG"='1000' AND "BLART"='10' AND ("TVORG"='0100' OR "TVORG"='0110'))
  54 - access("PMEND">='20120101' AND "PMEND"<='20190101')
       filter("PMEND">='20120101' AND "PMEND"<='20190101' AND (LNNVL("PMTTO">='20120101') OR
              LNNVL("PMTTO"<='20190101')) AND (LNNVL("PMTFR">='20120101') OR LNNVL("PMTFR"<='20190101')) AND
              (LNNVL("PMTTO">='20190101') OR LNNVL("PMEND">='20120101') AND LNNVL("PMEND"='00000000') OR
              LNNVL("PMTFR"<='20120101')))
  57 - access("VERSOBJ_PAR_BEZ"."PARTNERACC"="VERTRAGSKONTO"."VKONT")
  60 - access("FKKVK"."VKONT"="PARTNERACC")
  63 - filter("FKKVK"."VKTYP"='10' OR "FKKVK"."VKTYP"='27' OR "FKKVK"."VKTYP"='50' OR "FKKVK"."VKTYP"='60' OR
              "FKKVK"."VKTYP"='75' OR "FKKVK"."VKTYP"='80')
  64 - access("VERSOBJ_PAR_BEZ"."PARTNER"="EZW"."GPART"(+) AND "VERSOBJ_PAR_BEZ"."PARTNERACC"="EZW"."VKONT"(+))
  66 - access("FKKVKP"."VKONT"="VKONT_PAR_DISTINCT"."VKONT" AND "FKKVKP"."GPART"="VKONT_PAR_DISTINCT"."PARTNER")
 
Meine Erfahrungen mit dem Auswerten von Oracle SQL Explain Plans sind leider quasi nicht existent, aber ich vermute das dauerhafte TABLE ACCESS FULL ist kein gutes Zeichen, sollten dort nicht normalerweise die verwendeten Indizes stehen?

Wird ja scheinbar auch ziemlich viel im Cache gebaut, Arbeitsspeicher ausreichend oder perma. I/O auf der Platte?
 
Ich bin zwar kein Oracle Profi, aber in der Schule haben wir in Datenbanksysteme gelernt, dass man "TABLE ACCESS FULL" durch einen passenden Index wegoptimieren sollte.
 
lfrst05 schrieb:
Ich bin zwar kein Oracle Profi, aber in der Schule haben wir in Datenbanksysteme gelernt, dass man "TABLE ACCESS FULL" durch einen passenden Index wegoptimieren sollte.

Krafty schrieb:
Hast du die Verwendung / das Vorhandensein der Indizes überprüft?

Wir können leider nicht für jedes SQL Indizes auf die Tabellen anlegen, das wären einfach zu viele. Wie ihr seht sind die Tabellen nicht gerade klein und ein haufen Indizes würde die Performance beim INSERT/UPDATE einbrechen lassen.
 
Interessantes Problem...

Wenn die Query 30h läuft, nehme ich mal an, dass sie nicht ständig ausgeführt wird?

Gibt es nicht die Möglichkeit die dort verwendeten Tables im RAM als TEMP anzulegen, nen INDEX rüber zu ziehen (was sicher auch ne Weile dauern wird) und die Query dann auf diese Tables abzusetzen?

kA ob das einen Zeitvorteil gibt.
 
Hilf mir mal auf die Sprünge - wie legt man Tabellen im RAM als TEMP an? CREATE TABLE?
Indexerstellung über die VVSCPOS dauert ca. 2 Stunden - hatten für nen anderen Fall das mal testhalber gemacht.

Das SQL soll natürlich nicht täglich laufen. :-)

Vorher war die Abfrage anders aufgebaut - die DIMAIOBPAR wurde als führende Tabelle per FETCH zeilenweise ausgelesen und dan zu jeder Zeile die anderen Tabellen abgefragt. Also einmal 10 Mio Zeilen und dann jweils 10 Mio Selects auf die 5 anderen Tabellen. Laufzeit dieser Variante waren 10 Stunden bei 10 parallelen Tasks. Also insgesamt 100 Stunden laufzeit.

Hab auch mal gelesen, daß Oracle eh nen FullTableScan verwendet, wenn es erkennt, daß mehr als 20% der Daten aus den Tabellen verwendet werden.
 
Ohne deine SQL Anfrage komplett angeschaut zu haben:

Oracle unterstützt doch (materialisierte) Sichten? Vielleicht ist das nen Blick wert.
 
Wie Krafty schon sagte, würde ich anstatt der Common Table Expression mit Temporären Tabellen arbeiten und dann entsprechend indizieren:

CREATE TEMPORARY TABLE temp (...);

CREATE [CLUSTERD|NONCLUSTERED] INDEX on temp(...);

Syntax bin ich mir leider nicht genau sicher, da ich von MS SQL SERVER komme.
Damit solltest du aber die Performance verbessern können.
 
Da ich mehr mals um die 7 mio Datensätze lese in dem explain,
gehe ich davon aus das es eine Datewarehouse oder ähnliches ist.

Daraus ergeben sich ein paar sachen die man in diesen umfeld macht.
Zu einem Index benutzen!!!
Es gibt hier sehr wichtig zu wissen mehre Arten von indexen,
für daten wo der daten inhalte kleine variants hat wie z.b. Geschlechter(w oder m) nimmt man
bitmap index, für normale daten den standard index.

Insert und Delete Performance leidet unter index, ja, aber man kann sie ausschalten die index
und nach den batch opertation wieder einschalten. (nicht dropen)

Ich vermisse in deinen explain eine Paralitäts Angabe, daher nehme ich an, dass das Select
nicht parallel ausgeführt wird, das kann man ändern.
mit select /*+ parallel */...
Ich fand den artikel: http://www.oracle.com/webfolder/technetwork/de/community/dbadmin/tipps/parallel_query/index.html
Interessant es gibt aber viele google treffer zu „oracle select parallel“ wenn du dich weiter informieren willst.
Wichtig für die allgemeine performance und auch für die Paralitäts performance ist das richtige Partitionieren der Daten auf den unterschiedlichen Tabelspaces, so dass im Optimum alle hdd gleichmäßig ausgelastet sind.

Was wieder auf kosten der delete und insert gehen könnte, aber auch vielleicht nicht, wäre eine Kompression der Daten damit verbrauchen die daten auf der einen seite weniger platz auf der hdd auf der anderen seite könnten sie dann schneller ausgelesen werden. Man sollte dann schauen ob nicht auf column oriented storage umschaltet bei manchen tabellen je nachdem wie groß und wie viel spalten sie hat: http://www.dba-oracle.com/t_row_column_oriented_data_storage_tde.htm
Es lohnt gerade dort wo es viele spalten in einer tabelle gibt aber nur eine geringe anzahl selektiert werden und damit werden bessere kompression Eigenschaften erreicht.

Hf beim testen der paar Vorschläge ich würde, wenn halt alles gemacht werden soll, mal nach „oracle datewarehouse performance“ oder ähnliches suchen um paar performance tricks kennen zu lernen.
 
Zurück
Oben