Laden...

Optimierung von Query mit Union und GroupBy

Erstellt von sindibad vor 8 Jahren Letzter Beitrag vor 8 Jahren 826 Views
S
sindibad Themenstarter:in
110 Beiträge seit 2012
vor 8 Jahren
Optimierung von Query mit Union und GroupBy

verwendetes Datenbanksystem: <oracle>
hallo zusammen,

ich habe eine Tabelle A , wo die Daten nach einer bestimmte Zeit in eine andere Tabelle B archiviert werden.
Tabellen A und B haben die gleiche Spalten.
Ich mache Statistiken auf die daten auf einer Tabelle so


SELECT s1, s2, SUM(s3), SUM(s4) , SUM(s5), SUM(s6),  SUM(s3+ s4), CAST(SUM(s5)*100/SUM(s3+s4) AS INTEGER) RATIO
FROM A
WHERE TS_START >= TO_DATE(?, 'DD/MM/YY') AND TS_START <= TO_DATE(?, 'DD/MM/YY')  
GROUP BY s1,s2

ich möchte jetzt die Statistik auf die zwei Tabellen anwenden und das mache ich mit union so


SELECT s1, s2, SUM(s3), SUM(s4) , SUM(s5), SUM(s6),  SUM(s3+ s4), CAST(SUM(s5)*100/SUM(s3+s4) AS INTEGER) RATIO
FROM 
(
SELECT s1, s2, s3, s4,s5,s6
FROM A
WHERE TS_START >= TO_DATE('31/01/14', 'DD/MM/YY') and TS_START <= TO_DATE('31/03/15', 'DD/MM/YY') 

UNION

SELECT s1, s2, s3, s4,s5,s6
FROM B
WHERE TS_START >= TO_DATE('31/01/14', 'DD/MM/YY') and TS_START <= TO_DATE('31/03/15', 'DD/MM/YY') 

)
GROUP BY s1,s2

die Abfrage funktioniert aber sie dauert sehr lange dreifach so lang in vergleich zur Abfrage auf einer Tabelle.
wie kann ich diese Abfrage optimieren?

3.003 Beiträge seit 2006
vor 8 Jahren

Paar Möglichkeiten:

1.) UNION ALL
2.) skalare subqueries


select s1,s2,sum(s3) from 
(select s1, s2, s3 from Table_1) query1,
(select s1, s2, s3 from Table_2) query2;

3.) View
4.) auswertung von Ausdrücken (cast(sum(s5)*100/sum(s3+s4) as integer) nicht in der Abfrage, sondern im Client
5.) smartes indexing
6.) full outer join soll angeblich etwas schneller sein als union

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

H
523 Beiträge seit 2008
vor 8 Jahren

Hallo sindibad,

schau Dir evtl. auch mal den Queryplan (bei Oracle heißt es glaube ich Explain Plan) Deiner Abfragen an. Dieser könnte Dir ggf. bei der Optimierung auch helfen.

3.003 Beiträge seit 2006
vor 8 Jahren

(bei Oracle heißt es glaube ich Explain Plan)

execution plan - sehr guter Hinweis, abhängig von der Version werden einige meiner Vorschläge oben auch schon in was anderes übersetzt.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)