Announcement

Collapse
No announcement yet.

zeitnahe werte finden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • zeitnahe werte finden

    Hi,

    ich habe eine Tabelle mit bis zu 1000000 Datensätzen. Die enthält einen Spalte mit einem Zeitstempel. Machen Datensätze sind doppelt vorhanden haben aber einen Zeitstempel mit einer Differenz von bis zu 5 Sekunden, da sie aus unterschiedlichen Quellen kommen. Ich wüde nun gerne diese 'doppelten' Datensätze finden.

    Aktuell mache ich es mit einer Stored Procedure in dem ich die Tabelle durchlaufe und den Zeitstempel jedes Datensatzes zum Suchen in den restlichen verwende.

    Tabelle 'data' mit den Spalten 'ID', 'SP1', 'SP2', 'SP3', 'DUPLI', 'DUPLICHECK' ---> wobei duplicheck der Zeitstempel als bigint umgerechnet ist.

    Ich selektiere alle DS aus data mit

    'for select id, duplicheck from data order by duplicheck into :myid, :mycheck' do'

    und dann

    'update data set dupli = '1' where duplicheck between (:mycheck - 5) and (:mycheck + 5) and id != :myid'


    Dauert nur ewig. Wie geht das denn schneller? Gibt es sowas wie group by (duplicheck +- 5)?
    Oder ist es einfach so und ich muss damit leben, dass es ewig dauert?


    Gruß,
    kk

  • #2
    Beim Group by wirst du nichts relatives zu anderen Datensätzen hinbekommen. Da geht es immer um ein absolutes Maß. Warum nicht einfach ein self join auf die Data Tabelle?

    [HIGHLIGHT=SQL]select d1.*
    from data d1
    inner join d2 on d1.ID != d2.ID AND (hier weitere Duplikatskriterien eintragen)
    where d1.DUPLICHECK - d2.DUPLICHECK < 5 -- oder > je nachdem welchen der beiden Datensätze du als das Duplikat markieren willst.
    [/HIGHLIGHT]

    Comment


    • #3
      Passt perfekt. Bin da noch sehr grün hinter den Ohren, bei SQL. Und jedesmal wenn was mit Join kommt, verknotet sich leider auch mein Hirn. Daher wär ich da vermutlich nie drauf gekommen.

      Vielen Dank und Problem damit erledigt.

      Comment


      • #4
        Jetzt hätt ich doch noch eine Verständnisfrage.

        Mit dieser Abfrage erhalte ich nach ca. 5 Sekunden bei knapp über einer Million Datensätzen die erwarteten 4 Ergebnisse:

        Code:
        select d1.id from data d1 inner join data d2 on d1.id != d2.id and d1.a_number = d2.a_number and d1.b_number = d2.b_number 
        where d1.duplicheck between (d2.duplicheck - 5) and (d2.duplicheck + 5) order by d1.id;
        Wenn ich diese Abfrage nutze, um die Id's der Datensätze zu erhalten, die ich updaten möchte, arbeitet die Kiste sich eine Wolf und bringt keine Reaktion (zumindest nach bisher ca. einer halben Stunde):

        Code:
        update data set dupli = '1' where id in (select d1.id from data d1 inner join data d2 on d1.id != d2.id and d1.a_number = d2.a_number and d1.b_number = d2.b_number 
        where d1.duplicheck between (d2.duplicheck - 5) and (d2.duplicheck + 5) order by d1.id);
        Müsste nicht durch die Sortierung auf jeden Fall erst mal intern die Abfrage komplett durchgeführt und dann einfach 4 Update-Statements ausgeführt werden?


        Zum Testen verwende ich das Kommandozeilentool isql.


        Gruß,
        kk

        Comment


        • #5
          Hallo,
          Originally posted by karl.kojote View Post
          ...Müsste nicht durch die Sortierung auf jeden Fall erst mal intern die Abfrage komplett durchgeführt und dann einfach 4 Update-Statements ausgeführt werden?
          Wie genau das der Server intern umsetzt kannst du dir über den Execution-Plan des Statements ansehen. Das ist immer ein guter Ansatz um Performance-Schwachstellen einer Abfrage zu erkennen. Evtl lohnt es sich auch das Update in Join-Syntax (weiss nicht ob Firebird das Unterstützt) oder mit einem EXISTS statt IN zu formulieren. Das ORDER BY in der Subquery kannst du auf jeden Fall weglassen, da es ja völlig irrelevant ist, in welcher Reihenfolge die Datensätze geändert werden.

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment

          Working...
          X