Ich verwende SQL Server 2005. Es gibt eine Audit-Trail-Tabelle mit über 1.000.000.000 Zeilen. Ich plane, diese Tabelle zu archivieren. Wenn ich eine einfache Auswahl mit nolock
mache, kann ich immer noch blockieren (wahrscheinlich IO Blocking mit anderen Prozess?). Gibt es also Best Practice für diese Art von Situation?
Bei einer so großen Tabelle möchten Sie eine effektive Strategie zum Teilen / Partitionieren finden. Das Archivieren in diesem Sinne ist eher eine Form der Partitionierung, aber keine gute, da man ohnehin häufig über das aktuelle Archiv nachfragen möchte. Im schlimmsten Fall enden Sie mit einem SELECT über eine UNION des Archivs und aktueller Tabellen, was schlimmer ist, als wenn Sie sie überhaupt nicht geteilt hätten.
Sie werden es oft besser machen, indem Sie andere Mittel finden, um die Daten zu teilen, zum Beispiel auf einem Datensatztyp oder etwas. Aber wenn Sie es nach Datum aufteilen, stellen Sie absolut sicher, dass Sie nicht über den Archiv + aktuellen Datensatz abfragen.
Außerdem aktiviert SQL Server 2005+ standardmäßig MVCC nicht. Es kann dies jedoch tun, wenn Sie aktivieren, was MS Snapshot Isolation nennt. Siehe Serialistic vs. Snapshot Isolation Level .
Wenn nicht aktiviert ist, bewirkt dies, dass ein nicht festgeschriebenes INSERT oder UPDATE ein SELECT in einer anderen Transaktion blockiert, bis die erste Transaktion festgeschrieben oder rückgängig gemacht wird. Dies kann zu unnötigen Sperren führen und Ihre Skalierbarkeit einschränken.
Erstellen Sie eine Sicherungskopie der Datenbank und stellen Sie sie am Speicherort des Archivs wieder her.
Wenn Sie 1 Milliarde Zeilen gleichzeitig auswählen, wird der Server belastet, ganz gleich, wie Sie es tun.
Tun Sie es stattdessen in Stapeln, sagen Sie 1000 Reihen gleichzeitig. Das bcp-Tool erledigt dies automatisch. Oder benutze SSIS, um die Daten in eine andere Datenbank zu kopieren - es macht ziemlich genau dasselbe.
Tags und Links sql sql-server database