AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Abfrage mit Summe optimieren

Abfrage mit Summe optimieren

Ein Thema von EarlyBird · begonnen am 27. Aug 2014 · letzter Beitrag vom 28. Aug 2014
Antwort Antwort
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.881 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Abfrage mit Summe optimieren

  Alt 27. Aug 2014, 13:20
Da lfd+1 ja lfd einschliesst, sollte es doch einfach so funktionieren ( in FB PSQL)

SQL-Code:
SET TERM ^^ ;
CREATE PROCEDURE SUMMWERTE returns (
  LFD BigInt,
  WERT Double Precision,
  WERTSUM Double Precision) AS
BEGIN
  SUSPEND;
END ^^
SET TERM ; ^^
SET TERM ^^ ;
ALTER PROCEDURE SUMMWERTE returns (
  LFD BigInt,
  WERT Double Precision,
  WERTSUM Double Precision) AS
declare w double precision;
begin
  wertsum = 0;
  w = 0;
  for select
        lfd, wert from STAMM order by lfd into :lfd, :wert do
        begin
          for select wert from WERT where lfd = :lfd into :w do
          begin
            wertsum = :wertsum + :w;
          end
          suspend;
        end
end ^^
SET TERM ; ^^
Mit einer einfachen Testdatenbak scheint es zu funktionieren.
Markus Kinzler
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#2

AW: Abfrage mit Summe optimieren

  Alt 27. Aug 2014, 13:29
Das ist aber kein T-SQL...
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.881 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Abfrage mit Summe optimieren

  Alt 27. Aug 2014, 13:49
Ja, habe ich ja auch geschrieben ( FB PSQL). Prinzipiell sollte es aber auch unter T-SQL so funktionieren.
Markus Kinzler
  Mit Zitat antworten Zitat
EarlyBird

Registriert seit: 29. Mär 2007
235 Beiträge
 
#4

AW: Abfrage mit Summe optimieren

  Alt 27. Aug 2014, 14:06
Danke schon mal für die Anregungen.

Wie mir (partition over, rank, dense rank, rownumber, usw.) helfen sollen erschließt sich mir nicht.
Ich benötige ja die Summe der Werte und keine Zeilennummern

Ich habe es jetzt mit der Temporären Tabelle getestet und das funktioniert super.
Geschwindigkeit ist optimiert von 19008 ms zu 470ms
das nenne ich mal super optimiert

Vielen Dank

Eine Frage habe ich noch zur temporären Tabelle.
Kann ich die am Ende der SP einfach per DROP TABLE #tmp löschen?
Oder gibt das Probleme

So sieht die SP jetzt aus
Code:
create PROCEDURE [dbo].[SumTest](@LFDVar Int)
AS
BEGIN
declare @summe int
set @summe = 0
SELECT Wert, LFD, 0 as summe into #tmp from Table1 where (not (Wert is Null)) order by LFD
update #tmp
  set summe = @summe
    , @summe = @summe + wert

select t.wert, t.LFD, x.summe
  from Table1 t
       join #tmp x on t.LFD = x.LFD where t.LFD > @LfdVar order by t.LFD

DROP TABLE #tmp
END
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#5

AW: Abfrage mit Summe optimieren

  Alt 27. Aug 2014, 14:17
sollte keine Probleme machen. Kann nur sein, das dein Provider (ADO o.ä.) mit der message vom 'xxx rows affected' probleme bekommt, weil 'DROP TABLE' etwas anderes sagt. Musst Du ausprobieren. Normalerweise macht man das am Anfang der SP.
Code:
IF OBJECT_ID ('tempdb..#TMP') IS NOT NULL
  DROP TABLE #TMP
@mkinzler: Die vorgeschlagene Lösung (Schleife) wird auch funktionieren, aber dein vorgestellter Code ist 99% FB eigen, und taugt daher als Ansatz für TSQL nicht... Das ist vollkommen anders, als in TSQL. Da wäre das ne While-Schleife.

Geändert von Dejan Vu (27. Aug 2014 um 14:19 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: Abfrage mit Summe optimieren

  Alt 27. Aug 2014, 14:17
Wie mir (partition over, rank, dense rank, rownumber, usw.) helfen sollen erschließt sich mir nicht.
Ich benötige ja die Summe der Werte und keine Zeilennummern
Das ist eine unvollständige Aufzählung der Windowfunktions unter 2005 server. Wenn sich da nichts erschließt ist es wohl Pech.
Gruß, Jo
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#7

AW: Abfrage mit Summe optimieren

  Alt 27. Aug 2014, 14:21
Zeig doch mal deinen Ansatz. Ich glaube, es ist nicht klar, wo der Vorteil von ROW_NUMBER ggü dem Feld 'lfd' ist.

Edit: Ich sehe gerade
SQL-Code:
SELECT *,
  SUM(wert) OVER(ORDER BY lfd
     ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
          AS Summe
  FROM Table1
ungetestet (soll ANSI-SQL sein)

Und woher hab ich das?
http://stackoverflow.com/questions/8...l-in-sqlserver

Geändert von Dejan Vu (27. Aug 2014 um 14:31 Uhr)
  Mit Zitat antworten Zitat
EarlyBird

Registriert seit: 29. Mär 2007
235 Beiträge
 
#8

AW: Abfrage mit Summe optimieren

  Alt 27. Aug 2014, 14:32
Danke Dejan Vu
Das sind Ansätze die weiterhelfen.
Werde es gleich Testen
  Mit Zitat antworten Zitat
EarlyBird

Registriert seit: 29. Mär 2007
235 Beiträge
 
#9

AW: Abfrage mit Summe optimieren

  Alt 27. Aug 2014, 14:59
SQL-Code:
SELECT *,
  SUM(wert) OVER(ORDER BY lfd
     ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
          AS Summe
  FROM Table1
Das funktioniert in SQL 2005 leider noch nicht
Habe es gerade auf einem Sql 2012 Server getestet da klappt es.

Das optimiert unter SQLServer 2012 noch mal von 316ms auf 79ms
(Temporäre Tabelle gegenüber select sum over)

Leider kann ich es unter Sql 2005 noch nicht nutzen
Vielen Dank
(auch an jobo)
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz