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:
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!
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!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 321382
Url: https://administrator.de/contentid/321382
Ausgedruckt am: 22.11.2024 um 00:11 Uhr
5 Kommentare
Neuester Kommentar
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.
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.
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é
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é
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
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
Unter (MSSQL, Postgre, Oracle) könntest du eventuell mit WITH arbeiten um deine zu joinende Tabelle erstmal anzulegen. Etwa so:
Könnte eventuell die Abfrage beschleunigen, könnte...
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