samet22
Goto Top

SUM oder AVG in SQL Abfrage dauert viel zu lange warum?

Hallo,

Ich hoffe ihr könnt mir bei dieser schweren Aufgabe helfen. Habe für ein Statistik Programm eine SQL Abfrage gebastelt welches über mehrere Tabellen geht. Im letzten Join beziehe ich eine Tabelle welche ich über eine Select selber erstelle:

from ((select c000, c003,c068, c055, c004, c007, c005, c031, c072, c082, mesoyear from t026 where mesoyear=1392) t026 JOIN (select c000, c030, c021,c004, c044,c045,c055, c029, c032, mesoyear from t025 where mesoyear =1392) t025 ON Left(t026.c000,(LEN(t026.c000)-7))=t025.c000 
 JOIN (select c036, c002, mesoyear from t024 where mesoyear=1392) t024 ON t024.c002 = t026.c003 
 JOIN (select c016, c001, mesoyear from t031 where mesoyear =1392) t031 ON t024.c002=t031.c016 
 JOIN (select c000, c001, c002, c003, c004, c005, c006, c007, c016, c017, mesoyear from t057 where mesoyear=1392) t057 ON Right(T057.c000,LEN(t057.c000)-4)=t025.c021)
 JOIN (select c119, c112, mesoyear from t054 where mesoyear=1392) t054 ON t054.c112 = t025.c021
 LEFT JOIN (**select C003 AS Artikelcharge, SUM(c005) AS Summemenge, AVG(c023) AS Meinstpn from t026 where mesoyear=1392 AND C000 Like 'L%' GROUP BY c003**) etab ON etab.Artikelcharge = t026.c003  

Das Problem ist liegt genau bei SUM(c005) und AVG(c023). Wenn ich meine komplette abfrage so ausführe: LEFT JOIN (select C003 AS Artikelcharge, from t026 where mesoyear=1392 AND C000 Like 'L%' GROUP BY c003) etab ON etab.Artikelcharge = t026.c003. Dann dauert sie zwischen 15-22 Sekunden was noch okey ist da ich über 10 Millionen Datensätze abfrage.

Führe ich die Abfrage aber mit AVG und SUM druch (siehe oben): LEFT JOIN (select C003 AS Artikelcharge, SUM(c005) AS Summemenge, AVG(c023) AS Meinstpn from t026 where mesoyear=1392 AND C000 Like 'L%' GROUP BY c003) etab ON etab.Artikelcharge = t026.c003. Dann dauert die Abfrage 1 Minute und 20 sekunden!!!! WIESO? ich finde einfach keine Lösung!

Setze ich das Select alleine in einer eigenen Abfrage ab (nicht im Join) mit SUM und AVG dann dauert die Abfrage 0,5 Sekunden! WAS GENAU verursacht diese Wartezeit? finde einfach keine Lösung!

Kurze Anmerkung: Meine erste Abfrage liefert mir ca. 95.000 Zeilen und die Abfrage mit AVG und SUM liefert ca. 16.000 Zeilen.

Ich hoffe ihr könnt mir helfen. DANKE!

Content-ID: 321382

Url: https://administrator.de/contentid/321382

Ausgedruckt am: 22.11.2024 um 00:11 Uhr

ukulele-7
ukulele-7 18.11.2016 um 08:35:37 Uhr
Goto Top
Aus meiner Sicht ist dein Code recht unübersichtlich, vor allem diese (INNER) JOINs mit Subselect mache ich eigentlich nur, wenn es wie in deinem letzten Fall noch eine Berechnung gibt. Ob sich das auf die Performance auswirkt kann ich so nicht sagen, sieht aber wild aus.

Dazu kommt diese tolle Namensgebung für Tabellen und Spalten.

Welches SQL verwendest du? Normalerweise wird dir EXPLAIN bei der Suche nach Performance-Bremsen helfen und eventuell (je nach SQL) auch einen passenden Index vorschlagen. Ob diese Abfrage aber so wirklich sinnvoll ist kann man unmöglich anhand von Spalten sagen, deren Inhalt man nicht kennt.
atze187
atze187 18.11.2016 um 09:32:08 Uhr
Goto Top
Hi,

wie @ukulele-7 sagt ist das weder übersichtlich noch für einen Außenstehenden nachzuvollziehen, was dort passiert. Dazu kommt es es unvollständig ist.

Wenn das eine T-SQL-Query ist, dann empfehle ich dir die Execution Plans der Query anzuschauen.

Gruß,
André
Rudbert
Rudbert 18.11.2016 um 09:41:50 Uhr
Goto Top
Hi,


die Abfrage sieht ziemlich gekünstelt aus, da könnte man bestimmt was optimieren; ohne die Kenntnis der genauen Datenstruktur ist das aber hier pauschal nicht so zu beantworten.

Evtl. kannst du auch mit zusätzlichen Indizes die Abfrage beschleunigen.

Wo genau die Flaschenhälse sind liefert dir der execution plan wie schon erwähnt (http://stackoverflow.com/questions/7359702/how-do-i-obtain-a-query-exec ...) für MSSQL, "EXPLAIN PLAN" für Oracle).


mfg
samet22
samet22 18.11.2016 um 09:45:09 Uhr
Goto Top
Hallo Danke für eure Antworten

Also die Datenbank ist von einem ERP System somit will ich dort außer Selects nichts hinzufügen (auch keine Indexe) die Tabellen Bezeichnung ist somit vorgegeben.

Um meine Joins für euch einfacher zu gestalten:
from (t026 JOIN  t025 ON Left(t026.c000,(LEN(t026.c000)-7))=t025.c000  
 JOIN t024 ON t024.c002 = t026.c003  
 JOIN t031 ON t024.c002 = t031.c016  
 JOIN t057 ON Right(T057.c000,LEN(t057.c000)-4)=t025.c021) 
 JOIN t054 ON t054.c112 = t025.c021 
 LEFT JOIN (select C003 AS Artikelcharge, SUM(c005) AS Summemenge, AVG(c023) AS Meinstpn from t026 where mesoyear=1392 AND C000 Like 'L%' GROUP BY c003) etab ON etab.Artikelcharge = t026.c003  

Im letzten Join füge ich eine Tabelle hinzu welches ich mir durch eine Abfrage selber generiere. Und hier habe ich festgestellt, dass durch die funktionen SUM und AVG die Abfrage 1 Minute länger dauert - statt 20 sekunden dauert sie 1 Minute und 20 Sekunden.

Für ich in einer eigenen Abfrage nur select C003 AS Artikelcharge, SUM(c005) AS Summemenge, AVG(c023) AS Meinstpn from t026 where mesoyear=1392 AND C000 Like 'L%' GROUP BY c003 durch dann dauert dies 0,5 Sekunden.
ukulele-7
ukulele-7 18.11.2016 aktualisiert um 10:50:56 Uhr
Goto Top
Unter (MSSQL, Postgre, Oracle) könntest du eventuell mit WITH arbeiten um deine zu joinende Tabelle erstmal anzulegen. Etwa so:
WITH tabelle AS (
select C003 AS Artikelcharge, SUM(c005) AS Summemenge, AVG(c023) AS Meinstpn
from t026
where mesoyear=1392 AND C000 Like 'L%'  
GROUP BY c003
	)
SELECT	bla
from (t026 JOIN  t025 ON Left(t026.c000,(LEN(t026.c000)-7))=t025.c000   
JOIN t024 ON t024.c002 = t026.c003   
JOIN t031 ON t024.c002 = t031.c016   
JOIN t057 ON Right(T057.c000,LEN(t057.c000)-4)=t025.c021)  
JOIN t054 ON t054.c112 = t025.c021  
LEFT JOIN tabelle etab ON etab.Artikelcharge = t026.c003
Könnte eventuell die Abfrage beschleunigen, könnte...