2009-07-02 13 views
0

Ich habe eine SQL-Abfrage geschrieben, das für jedes Jahr-Week-Minen Produkt einen Bericht von einigen Statistiken erzeugt.SQL-Abfrage hängt an beitreten

Es funktioniert genau wie gewünscht mit Ausnahme einer Sache - trn.wid-date ist nicht das richtige Datum zu verwenden.

Ich sollte td.datetime-act-comp-dump verwenden. Als ich trn.wid-date mit td.datetime-act-comp-dump ersetzen, es gibt mir keine Fehler scheint aber nur auf unbestimmte Zeit zu hängen. Ich ließ es gestern für eine Weile gehen, und es kam mit ORA-01652 nicht mehr temporärem Segment von 128 in Tabellen TEMP zu verlängern, obwohl ich nicht, dass Fehler da gesehen habe.

Ich verstehe nicht, was verursachen könnte, dass man bedenkt, dass ich in der Lage bin erfolgreich MAX (td.datetime-act-comp-Dump) in der Abfrage unter

select to_char(trn.wid_date, 'IYYY') as dump_year, 
     to_char(trn.wid_date-7/24, 'IW') as dump_week, 
     SUBSTR(trn.train_control_id,1,2) as Mine, 
     vcon.product_type_code as Product, 
     COUNT(DISTINCT trn.train_control_id) as Trains, 
     COUNT(1) as Wagons, 
     MIN(trn.wid_date) as Min_WID_Hrs, 
     MAX(trn.wid_date) as Max_WID_Hrs, 
     MIN(td.datetime_act_comp_dump) as Min_Fin_Dump, 
     MAX(td.datetime_act_comp_dump) as Max_Fin_Dump,   
     ROUND(SUM(con.weight_total-con.empty_weight_total),0) as Tot_Tonnes,  
     ROUND(AVG(con.weight_total-con.empty_weight_total),2) as Avg_Tonnes, 
     ROUND(MIN(con.weight_total-con.empty_weight_total),2) as Minimum, 
     ROUND(PERCENTILE_DISC(0.99) WITHIN GROUP (ORDER BY (con.weight_total-con.empty_weight_total) DESC),2) as "1st",  

from widsys.consist con 
     INNER JOIN widsys.train trn 
     USING (train_record_id) 
     INNER JOIN tpps.train_details td 
     ON trn.train_tpps_id||trn.mine_code = td.train_id||td.mine_code 
     INNER JOIN widsys.v_consist_ore_detail vcon 
     USING (consist_id) 

where trn.direction = 'N' 
     and to_char(trn.wid_date, 'IYYY') = 2009 
     and to_char(trn.wid_date-7/24, 'IW') = 25 

group by to_char(trn.wid_date, 'IYYY'), 
     to_char(trn.wid_date-7/24, 'IW'), 
     SUBSTR(trn.train_control_id,1,2), 
     vcon.product_type_code 

order by to_char(trn.wid_date-7/24, 'IW') DESC 

Gerade zurück in Um Fehler zu beheben, habe ich aus der obigen Abfrage versucht, alles zu entfernen mit vcon und ersetzen trn.wid_datum mit td.datetime-act-comp-dump. Der Effekt ist, dass es Berichte über nur Jahr-Week-Minen statt Jahr-Week-Minen Produkt. (Siehe Abfrage unten)

Diese neue Abfrage tatsächlich ausführt und nicht nur hängen, gibt aber ein paar ungeradeen Ergebnisse und tut, ist nicht nicht ausreichend, da es Dinge bricht nicht auf Produkt.

select to_char(td.datetime_act_comp_dump, 'IYYY') as dump_year, 
     to_char(td.datetime_act_comp_dump-7/24, 'IW') as dump_week, 
     SUBSTR(trn.train_control_id,1,2) as Mine, 
     --vcon.product_type_code as Product, 
     COUNT(DISTINCT trn.train_control_id) as Trains, 
     COUNT(1) as Wagons, 
     MIN(trn.wid_date) as Min_WID_Hrs, 
     MAX(trn.wid_date) as Max_WID_Hrs, 
     MIN(td.datetime_act_comp_dump) as Min_Fin_Dump, 
     MAX(td.datetime_act_comp_dump) as Max_Fin_Dump,   
     ROUND(SUM(con.weight_total-con.empty_weight_total),0) as Tot_Tonnes,  
     ROUND(AVG(con.weight_total-con.empty_weight_total),2) as Avg_Tonnes, 
     ROUND(MIN(con.weight_total-con.empty_weight_total),2) as Minimum, 
     ROUND(PERCENTILE_DISC(0.99) WITHIN GROUP (ORDER BY (con.weight_total-con.empty_weight_total) DESC),2) as "1st"  

from widsys.consist con 
     INNER JOIN widsys.train trn 
     USING (train_record_id) 
     INNER JOIN tpps.train_details td 
     ON trn.train_tpps_id||trn.mine_code = td.train_id||td.mine_code 
     --INNER JOIN widsys.v_consist_ore_detail vcon 
     --USING (consist_id) 

where trn.direction = 'N' 
     and to_char(td.datetime_act_comp_dump, 'IYYY') = 2009 
     and to_char(td.datetime_act_comp_dump-7/24, 'IW') = 25 

group by to_char(td.datetime_act_comp_dump, 'IYYY'), 
     to_char(td.datetime_act_comp_dump-7/24, 'IW'), 
     SUBSTR(trn.train_control_id,1,2) 
     --vcon.product_type_code 

order by to_char(td.datetime_act_comp_dump-7/24, 'IW') DESC 

Irgendwelche Ratschläge, was schief gehen könnte?

Cheers,

Tommy

Antwort

0

ich es geschafft, um es auszuführen muuuuuuuch schneller zu erhalten, indem eine Unterabfrage für widsys Tabellen und eine für TPPS Tabellen zu erstellen. Dann tut eine implizite innere Verknüpfung auf zwei Spalten statt verketten.

SELECT blah FROM (widsys subquery) w, (tpps subquery) t WHERE w.mine_code = t.mine_code and w.train_id = t.train_tpps_id 
1

Das einzige, was ich mir vorstellen kann, ohne weitere Informationen ist, dass die datetime_act_comp_dump Spalte von train_details nicht indiziert ist und wid_date ist. Das klingt wie ein ziemlich normales Leistungsproblem, wo etwas nicht indiziert oder die train und train_details Tabellen sind dramatisch unterschiedliche Größen und Ihre Join Sprengung.

Ich bin nicht sicher, dass die DB Sie verwenden, aber Sie könnten, um herauszufinden, wollen, wie der Abfrageausführungsplan Profiler laufen und sehen, was der Unterschied zwischen den beiden Ausführungsplänen ist. Ich vermute, dass die Antwort etwas strukturelle oder vielleicht sein wird, dass die Verkettung in der Join-Anweisung verursacht einige DB-spezifische Probleme.