Frage

Unsere Datenbank ist SQL Server 2008 R2.Wir haben einige Tabellen mit einigen varchar (500) -Spalten, die ich zu datetime2 oder bigint wechseln möchte.Ich kann garantieren, dass alle Daten in den zu schaltenden Spalten für den richtigen Typ gültig sind.Die Spaltenänderungen wirken sich auf Indizes aus, nicht jedoch auf Schlüssel.

Im Gespräch mit Kollegen sind wir zu zwei Möglichkeiten gekommen, das Problem anzugehen.Beides würde über T-SQL-Skripte erfolgen.

  1. Erstellen Sie eine temporäre Tabelle über select into , löschen Sie die alte Tabelle und erstellen Sie die Tabelle mit den richtigen Datentypen neu.Erstellen Sie die Indizes neu.
  2. Ändern Sie die aktuellen Tabellen- / Datentypen über ALTER TABLE x ALTER COLUMN Y datetime2 und dann die Indizes neu erstellen oder neu erstellen.

Da ich zuversichtlich bin, dass die Daten sauber konvertiert werden, neige ich zu # 2.Mein Kollege und ein DBA-Freund bevorzugen # 1, aber mein Kollege kann sich nicht erinnern, warum sie ihn so trainiert haben.Der DBA-Freund ist im Urlaub, also habe ich ihn nicht gefragt, warum.

Kann jemand einen Einblick geben, welche Option er für besser hält und warum?Letztendlich ist es meine Entscheidung und ich frage mich, warum # 1 # 2 vorgezogen wird?

War es hilfreich?

Lösung

Ich habe dies kürzlich in meiner Organisation getan, in der wir eine Tabelle mit mehr als einer Milliarde Zeilen verarbeiten wollten.

Die ganze Anerkennung für die Idee geht an Aaron Bertrand und stammt aus seinem Blogbeitrag Trickschüsse :Schemaschalter-A-Roo

Testen Sie den folgenden Prozess auf einem kleinen Tisch und machen Sie es sich bequem, bevor Sie es in PROD tun.

  1. erstellen Sie 2 Schemata fake und shadow mit Genehmigung dbo.
  2. Erstellen Sie eine Tabelle mit den gewünschten Spalten und Datentypen shadow schema z.B. create table shadow.Correct_Table ...
  3. Fügen Sie die Daten ein und erstellen Sie alle Indizes, die die Originaltabelle in der shadow schema-Tabelle.
  4. Auf diese Weise haben Sie identische Tabellenkopien mit Daten und Indizes, die sich jedoch in unterschiedlichen Schemata befinden (logisch getrennt).
  5. Sobald Sie fertig sind, aktualisieren Sie die Statistiken auf dem Tisch mit shadow Schema.
  6. Wechseln Sie die Schemata (Dies ist eine Metadatenoperation und ist extrem schnell)

    --- ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 
    
    BEGIN TRANSACTION;
    
      ALTER SCHEMA fake TRANSFER     dbo.original_table;
      ALTER SCHEMA dbo  TRANSFER  shadow.Correct_Table;
    
    COMMIT TRANSACTION;
    
    ALTER SCHEMA shadow TRANSFER fake.Lookup;
    
  7. Machen Sie eine letzte Überprüfung, um zu sehen, ob alles wie geplant gelaufen ist.Du solltest einen machen select count(1) from dbo.Correct_table

  8. Sobald Schritt 7 bestätigt ist und Sie zufrieden sind, lassen Sie die shadow.table, shadow schema und fake schema als aufräumen.

Andere Tipps

hier ist so, wie ich es sehe.

Profis für # 1

    .
  • Weil Sie eine separate Tabelle verwenden, in der Ihr Produktionstisch verwendet wird, bleibt Ihr Produktionstisch, bis Sie fertig sind. Keine Schlösser darauf (über diejenigen, die zum Lesen der Daten erforderlich sind).
  • Das geht auch mit dem, was @aaronbertrand sagte: Sie können es stückweise tun, testen usw.
  • Sie können die Säulenordnung bei Bedarf ändern

Profis für # 2

    .
  • Es ist eine ganze oder nichts Operation. Es gibt keine Chance, dass Sie Daten verlieren, die in der ursprünglichen Tabelle eingefügt / modifiziert wurden, während Sie nicht gesucht haben.
  • Alle Berechtigungen, die speziell dem Objekt zugewiesen sind, werden aufbewahrt. Wenn Sie # 1 verwenden, müssen Sie sicherstellen, dass Sie Skript und diese anwenden.

alles davon gesagt, ich werde normalerweise # 2 für kleine Tabellen verwenden, oder wenn ich einen Ausfall erhalte kann (immer ein Backup vor der Hand nehmen) und # 1, wenn ich nicht so groß ist, dass ein Ausfall oder ich muss Ordnen Sie die Spaltenreihenfolge neu ordnen usw. Wenn ich # 1 tun werde # 1 werde ich das Skript normalerweise über die GUI generieren und dann sorgfältig überprüfen, bevor Sie es läuft.

Seien Sie vorsichtig mit der Option Ablegen und neu erstellen:dies kann sys verlassen.hängt in einem ungeraden Zustand ab und verursacht Probleme bei zwischengespeicherten Plänen, bei denen sich die Reihenfolge oder der Typ der Spalten ändert.

Sie müssen auch Schritte unternehmen, um Berechtigungen auf Objektebene beizubehalten, da diese in der DROP und nicht automatisch mit dem nachfolgenden neu erstellt CREATE.

ALTER TABLE ist die sauberere Option IMO, aber stellen Sie sicher, dass Sie gründlich testen, bevor Sie es in der Produktion tun, um sicherzustellen, dass danach alles in Ordnung ist und um sicherzustellen, dass Sie wissen, wie lange die Operationen dauern werden (über eine Tabelle mit vielen Zeilen könnte dies eine ziemliche Zeit sein) ).

Mein Kollege endete, um einen Artikel darüber zu finden, was er bezog: http:// www.nigelrivett.net/sqladmin/altertableProblems.html .Nach dem Lesen und Realisierung unserer Jahresende war das Ende des Jahres, dass wir uns entschieden haben, die Änderungen nicht an den Säulentypen vorzunehmen und dies in den nächsten paar Monaten wiederzuarbeiten.Ich denke, nachdem ich den Artikel gelesen habe, kann ich einfach mit der Drop / Create-Methode gehen.

Danke an jeden für ihr Feedback dazu.Viele interessante Ansätze, um zu berücksichtigen, wenn wir uns entscheiden, vorwärts zu ziehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top