none
Geht das auch schneller? RRS feed

  • Frage

  • Hallo,

    Ganz grob: Ich erhalte Signale und muß die Dauer zwischen zwei Signalen als Kuchen darstellen.

    Damit das schneller geht ermittle ich die Dauer vom letzten letzten Signal zum aktuellen Signal

    und schreibe die in ein Feld Duration. (siehe Code unten)

    Für die Darstellung des Kuchens addiere ich Durationen gleichen Typs.

    Wenn sehr viele Signale eingehen ist untenstehender Code sehr resourcenfressend. Hättet ihr Verbesserungsvorschläge wie's performanter wäre?

     

    Danke Michael

     

     

    -- Hier wird die Dauer des letzten Status in duration eingetragen
         IF EXISTS (SELECT * FROM verfuegbarkeit WHERE ip = @ip AND typ = @typ)
        BEGIN
            -- Differenz zwischen letzten Eintrag und der aktuellen Zeit
            SET @von_zeitstempel = (SELECT MAX(datum) FROM verfuegbarkeit WHERE ip = @ip AND typ = @typ);
            SET @bis_zeitstempel = GETDATE();
            SET @duration = datediff(ss, @von_zeitstempel, @bis_zeitstempel);

            -- Letzten Eintrag updaten
            SET @last_id = (SELECT MAX(id) FROM verfuegbarkeit WHERE datum = @von_zeitstempel AND ip = @ip AND typ = @typ);
            UPDATE verfuegbarkeit SET duration = @duration WHERE id = @last_id;

            -- Hole letzten Status
            SET @last_status = (SELECT status FROM verfuegbarkeit WHERE id = @last_id);

            -- Aktuellen Status nach Chart-Definition schreiben
            UPDATE verfuegbarkeit_Chart_Definition SET last_status = @status WHERE (ip = @ip AND typ = @typ);
        END

    Montag, 28. Februar 2011 12:21

Antworten

  • Hallo,

    Ganz grob: Ich erhalte Signale und muß die Dauer zwischen zwei Signalen als Kuchen darstellen.

    Damit das schneller geht ermittle ich die Dauer vom letzten letzten Signal zum aktuellen Signal

    und schreibe die in ein Feld Duration. (siehe Code unten)

    Für die Darstellung des Kuchens addiere ich Durationen gleichen Typs.

    Wenn sehr viele Signale eingehen ist untenstehender Code sehr resourcenfressend. Hättet ihr Verbesserungsvorschläge wie's performanter wäre?

     

     

    -- Hier wird die Dauer des letzten Status in duration eingetragen
         IF EXISTS (SELECT * FROM verfuegbarkeit WHERE ip = @ip AND typ = @typ)
        BEGIN
            -- Differenz zwischen letzten Eintrag und der aktuellen Zeit
            SET @von_zeitstempel = (SELECT MAX(datum) FROM verfuegbarkeit WHERE ip = @ip AND typ = @typ);
            SET @bis_zeitstempel = GETDATE();
            SET @duration = datediff(ss, @von_zeitstempel, @bis_zeitstempel);

            -- Letzten Eintrag updaten
            SET @last_id = (SELECT MAX(id) FROM verfuegbarkeit WHERE datum = @von_zeitstempel AND ip = @ip AND typ = @typ);
            UPDATE verfuegbarkeit SET duration = @duration WHERE id = @last_id;

            -- Hole letzten Status
            SET @last_status = (SELECT status FROM verfuegbarkeit WHERE id = @last_id);

            -- Aktuellen Status nach Chart-Definition schreiben
            UPDATE verfuegbarkeit_Chart_Definition SET last_status = @status WHERE (ip = @ip AND typ = @typ);
        END

    Etwas was offensichtlich ist, wäre

            SET @von_zeitstempel = (SELECT MAX(datum) FROM verfuegbarkeit WHERE ip = @ip AND typ = @typ);
            SET @bis_zeitstempel = GETDATE();
            SET @duration = datediff(ss, @von_zeitstempel, @bis_zeitstempel);

    als ein einziges Statement schreiben:

    SELECT @Duration = DATEDIFF(...., MAX(datum), GETDATE()), @von_zeitstempel = MAX(datum) FROM .... WHERE...

    Bei wirklichen hohem Durchsatz sollte man sich auch nicht auf das IF EXISTS() verlassen. Paul Nielsen hat das mal gut beschrieben: http://sqlblog.com/blogs/paul_nielsen/archive/2007/12/13/10-lessons-from-35k-tps.aspx

    Ansonsten fehlen wirklich präzisere Informationen, zu was "schneller" im Vergleich zum Status Quo is und was "sehr viele Signale" sind, um etws Sinnvolles vorzuschlagen.


    -- Frank Kalis Microsoft SQL Server MVP Webmaster: http://www.insidesql.org
    • Bearbeitet Frank Kalis Montag, 28. Februar 2011 15:36 URL formatiert
    • Als Antwort markiert mimuel Dienstag, 1. März 2011 14:40
    Montag, 28. Februar 2011 15:23

Alle Antworten

  • hi Michael,

    du vermischt hier zwei klar voneinander getrennte Aufgaben:

    1. Erfassung der Daten (OLTP)
    2. Auswertung der Daten (DW)

    http://msdn.microsoft.com/de-de/library/ms179422.aspx

    Im Besonderen wenn es um die Erfassung einer großen Menge von Daten in kurzen Abständen geht, musst du die Aufgaben trennen. Nur so kannst du die Erfassung sicherstellen. Diese sollte dann idealerweise auch auf zwei getrennten Systemen geschehen.

    Ansonsten fehlen hier zu viele Detailinformationen, um dir einen konkreten Weg vorschlagen zu können. Im Besonderen, da Aussagen und Fragen wie "[..] sehr resourcenfressend.  [..] wie's performanter wäre?" ohne Rahmendaten nicht einzuordnen sind.


    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Montag, 28. Februar 2011 12:50
  • Hallo,

    Ganz grob: Ich erhalte Signale und muß die Dauer zwischen zwei Signalen als Kuchen darstellen.

    Damit das schneller geht ermittle ich die Dauer vom letzten letzten Signal zum aktuellen Signal

    und schreibe die in ein Feld Duration. (siehe Code unten)

    Für die Darstellung des Kuchens addiere ich Durationen gleichen Typs.

    Wenn sehr viele Signale eingehen ist untenstehender Code sehr resourcenfressend. Hättet ihr Verbesserungsvorschläge wie's performanter wäre?

     

     

    -- Hier wird die Dauer des letzten Status in duration eingetragen
         IF EXISTS (SELECT * FROM verfuegbarkeit WHERE ip = @ip AND typ = @typ)
        BEGIN
            -- Differenz zwischen letzten Eintrag und der aktuellen Zeit
            SET @von_zeitstempel = (SELECT MAX(datum) FROM verfuegbarkeit WHERE ip = @ip AND typ = @typ);
            SET @bis_zeitstempel = GETDATE();
            SET @duration = datediff(ss, @von_zeitstempel, @bis_zeitstempel);

            -- Letzten Eintrag updaten
            SET @last_id = (SELECT MAX(id) FROM verfuegbarkeit WHERE datum = @von_zeitstempel AND ip = @ip AND typ = @typ);
            UPDATE verfuegbarkeit SET duration = @duration WHERE id = @last_id;

            -- Hole letzten Status
            SET @last_status = (SELECT status FROM verfuegbarkeit WHERE id = @last_id);

            -- Aktuellen Status nach Chart-Definition schreiben
            UPDATE verfuegbarkeit_Chart_Definition SET last_status = @status WHERE (ip = @ip AND typ = @typ);
        END

    Etwas was offensichtlich ist, wäre

            SET @von_zeitstempel = (SELECT MAX(datum) FROM verfuegbarkeit WHERE ip = @ip AND typ = @typ);
            SET @bis_zeitstempel = GETDATE();
            SET @duration = datediff(ss, @von_zeitstempel, @bis_zeitstempel);

    als ein einziges Statement schreiben:

    SELECT @Duration = DATEDIFF(...., MAX(datum), GETDATE()), @von_zeitstempel = MAX(datum) FROM .... WHERE...

    Bei wirklichen hohem Durchsatz sollte man sich auch nicht auf das IF EXISTS() verlassen. Paul Nielsen hat das mal gut beschrieben: http://sqlblog.com/blogs/paul_nielsen/archive/2007/12/13/10-lessons-from-35k-tps.aspx

    Ansonsten fehlen wirklich präzisere Informationen, zu was "schneller" im Vergleich zum Status Quo is und was "sehr viele Signale" sind, um etws Sinnvolles vorzuschlagen.


    -- Frank Kalis Microsoft SQL Server MVP Webmaster: http://www.insidesql.org
    • Bearbeitet Frank Kalis Montag, 28. Februar 2011 15:36 URL formatiert
    • Als Antwort markiert mimuel Dienstag, 1. März 2011 14:40
    Montag, 28. Februar 2011 15:23