none
Umstieg GUID --> IDENTITY oder Sequenz RRS feed

  • Frage

  • Hallo,

    ich habe eine Datenbank (MS SQL SERVER 2008 R2) mit zwei großen Tabellen, die auch stark anwachsen und dort wird der Primärschlüssel als "uniqueidentifiert" definert. Die Software erzeugt die GUIDs selbst, was eine schöne Sache ist. Nicht so schön ist natürlich die Tatsache das es sich bei der Tabelle um Datensätze mit Zeitbezug handelt und alle Abfragen zeitliche Bereiche umfasst und die Indizierung bei GUIDs bewirkt dann ein Kreuz und Quer für alle Abfragen.

    Also sollte ich das wohl umstellen. Eine durchgehende Sequenz ist mir egal.

    Was wäre da der bessere Weg: int  mit Identity(startwert, increment) oder eine Sequenz, die von den Clients abgefragt wird. Das dürfte meinem bisherigen Weg mit den GUIDs am nächsten kommen. Nachdem ich nämlich ein Eintrag in Tabelle1 mache, benötige ich den Primärschlüssel für mehrere Datensätze in Tabelle2, wobei ich auch dort Primärschlüssel benötige. Also dann zwei Sequenzen mit Autowerten.

    Und das Hauptproblem: Wie vom Stand mit GUIDs auf INT migrieren?

    Tabelle1:

    mytabelle1_guid erstmal als Primärschlüssel lassen.
    mytabelle1_id als int anlegen. NULL zulassen.

    Tabelle2:

    mytabelle2_guid erstmal als Primärschlüssel lassen.
    mytabelle1_guid_fremdschluessel erstmal lassen.
    mytabelle2_id als int anlegen. NULL zulassen
    mytabelle1_id_fremdschluessel anlegen. NULL zulassen.

    Jetzt jeden Datensatz aus Tabelle1 lesen, sortiert nach Buchungsdatum und mytabelle1_id mit Sqeuenz1 füllen. Dann abfragen, ob Datensätze in Tabelle2 vorhanden sind (mytabelle1_guid_fremdschluessel) und wenn ja, dort mytabelle2_id mit Sequenz2 füllen. In mytabelle1_id_fremdschlüssel die zugehörige id aus tabelle1 eintragen.

    Zum Schluss dann die GUIDs löschen und Primärschlüssel wählen.

    Hmmmm.... Oder das über neue Tabellen lösen, nach der Migration die "alten" Tabellen löschen und "neue" Tabelle umbenennen.

    Oder gibt es da eine "schönere" Lösung mit bordeigenen Mitteln des Sql Servers.

    mfg

    EDIT 02.04.2013, 12:23: Sequenzen gibt es erst ab SQL Server 2012. Kann ich also nicht nutzen.
    • Bearbeitet HessischerBub Dienstag, 2. April 2013 10:25 Sequenzen gibt es erst ab SQL Server 2012. Kann ich also nicht nutzen.
    Dienstag, 2. April 2013 10:00

Antworten

  • Hallo,

    zunächst wäre das hier weniger eine Frage von Guid oder ..., sondern eine Organisationfrage der Tabelle an sich.

    Da Buchungsdaten chronologisch geordnet sein sollten (lt. GOB), sollte das die Tabelle widerspiegeln.
    Der Clustered Index sollte hier über das Buchungsdatum gebildet werden -
    sofern vorhanden in Verbindung mit einer übergeordneten Tabelle oder dem Konto usw.

    Der (zusätzliche) Primärschlüssel kann eine Identity- oder Guid Spalte mit NONCLUSTERED sein.
    Ausgenommen dass eine Guid verschwenderischer ist, spielt die Wahl keine so große Rolle mehr.

    Wobei man die Identity Spalte (oder wenn man mal hat, Sequenz)-Spalte nicht als Ordnungskriterium betrachten sollte,
    sondern nur als Eindeutigmacher.

    Ähnliches könnte sich für andere Tabellen im Buchungsbereich anbieten.

    Gruß Elmar


    Dienstag, 2. April 2013 16:21
    Beantworter

Alle Antworten