UUID Version 1 Gleichverteilung in Tabelle



  • Hi!

    Ich habe hier eine Tabelle mit ca. 20 Millionen Einträgen.
    Als PK habe ich eine UUID Version 1.

    Wie kann ich jetzt eine Range definieren mit der ich einen Teil der Tabelle abarbeiten kann und beim nächsten mal einen anderen Teil?

    Folgender Select würde die ganze Tabelle berücksichtigen:

    select count(*)
    from Tabelle
    where UUID 
    between '00000000-0000-0000-000000000000' and
            'ffffffff-ffff-ffff-ffffffffffff'
    

    Wie muss ich die UUIDs wählen damit ich z.B. erst die eine Hälfte dann die andere hälfte abarbeite?

    Dabei muss es jetzt nicht exakt die hälfte sein, aber in der Summe der Teile sollten schon alle Einträge enthalten sein.
    Z.b. Tabelle mit 100 Einträgen in 4 Teile mit jeweils
    21 Einträgen
    25 Einträgen
    23 Einträgen
    31 Einträgen
    100 Insgesamt

    Ziel ist es später die Tabelle in beliebigen Teilschritten abzuarbeiten.



  • Die Hälfte wäre ja '80000000-0000-0000-000000000000', aber das garantiert natürlich keine Gleichverteilung der Daten.

    Daher wäre evtl. ein Paging besser z.B. mittels Verwenden von OFFSET und FETCH zum Einschränken der zurückgegebenen Zeilen (falls es deine DB unterstützt).



  • Vorausgesetzt die Anzahl bleibt gleich und es gibt eine Sortierung z.B. nach GUID, dann über row_numer() (MSSQL) einen Zähler mitliefern lassen und nach diesem beliebig splitten.
    Besser natürlich in einer neuen Spalte merken, was Du bereits verarbeitet hast.



  • @Th69
    Nö, die Hälfte wäre nicht '80000000-0000-0000-000000000000'* - zumindest nicht wenn das Datenbank-System die UUIDs "korrekt" sortiert (MS SQL macht es z.B. korrekt).
    Grund: Die erste Stelle in der 8-4-4-4-12 Schreibweise ist ne Stelle mitten in einem Timestamp. Also nicht die höchstwertige Stelle und auch nicht die Stelle mit dem geringsten Wert - einfach schön mitten drinnen. Der Rest ist ebenso zerpflückt.
    Die höchstwertige Stelle der ganzen UUID bei MS SQL wäre der erste Teil der 12-er Gruppe. Also '00000000-0000-0000-0000-800000000000' wäre die Hälfte.

    @Dudeldu
    Um das abschätzen zu können muss man wissen wie die UUIDs erzeugt werden und wie dein DBMS die UUIDs vergleicht/sortiert.

    Aber: was willst du damit überhaupt erreichen?
    Wenn du die Tabelle bloss stückweise durchgehen willst, dann kannst du dir ja einfach die ersten z.B. 100.000 Zeilen holen, sortiert nach der UUID, und dann die letzte UUID merken.
    Bei der zweiten Abfrage machst du das selbe, nur mit der zusätzlichen Bedingung dass die UUID grösser ist als die zuletzt gemerkte.
    So kommst du auf eine perfekt gleichmässige Aufteilung, ohne dass du vorher irgendwas ausrechnen/ermitteln müsstest.

    *: Wenn schon dann müsste es '80000000-0000-0000-0000-000000000000' heissen.


Log in to reply