Ich habe eine Tabelle in Sql Azure enthält etwa 6M Zeilen. Ich möchte einen neuen Index dafür erstellen. Der cmd ist wie:
%Vor%Und nach ungefähr 15 Minuten tritt ein Fehler auf
"Nachricht 10054, Ebene 20, Status 0, Zeile 0
Beim Empfangen der Ergebnisse von der Datei ist ein Transport-Level-Fehler aufgetreten Server. (Provider: TCP Provider, Fehler: 0 - Eine bestehende Verbindung war zwangsweise vom Remote-Host geschlossen.) "
Ich habe es mehrmals versucht, habe den gleichen Fehler. Aber ich habe andere zeitaufwendige Abfragen ausgeführt, wie:
Fügen Sie in table1 (Col1, Col2, Col3) Col1, Col2, Col3 von table2
ein
Das dauerte 20 Minuten und kehrte erfolgreich zurück.
Die Abfragen wurden in derselben Sql Azure DB ausgeführt. Ich weiß nicht, was hier vor sich geht. Könnte jemand helfen? Danke!
Ich hatte das gleiche Problem mit Tabelle mit 100 Millionen Zeilen und kontaktierte Microsoft Support. Dies ist die Antwort, die ich bekam:
Der Grund, warum Sie den Index für Ihre Tabelle nicht erstellen können, ist der Sie sind mit einer Begrenzung auf der Plattform konfrontiert, die verhindert zu haben Transaktionen größer als 2 GB.
Die Erstellung eines Indexes ist eine transaktionale Operation, auf die man sich stützt das Transaktionsprotokoll, um die Verschiebung der Tabellenseiten auszuführen. Mehr Zeilen in einer Tabelle bedeutet mehr Seiten in das T-Log. Seit deinem Tisch enthält 100 Millionen Datensätze (was eine ziemlich große Zahl ist), ist es einfach für Sie, dieses Limit zu erreichen.
Um den Index zu erstellen, müssen wir den Ansatz ändern. Grundsätzlich werden wir eine temporäre (Staging) Tabelle verwenden, um die Daten, während Sie den Index für die Quelltabelle erstellen habe zuvor von Daten gelöscht.
Aktionsplan:
- Erstellen Sie eine Staging-Tabelle, die identisch mit der ursprünglichen Tabelle ist, aber ohne ein beliebiger Index (dies macht die Staging-Tabelle zu einem Heap)
- verschiebt die Daten aus der Originaltabelle in eine Staging-Tabelle (die Einfügung ist schneller, weil die Staging-Tabelle ein Heap ist)
- leere die ursprüngliche Tabelle
- Erstellen Sie den Index für die ursprüngliche Tabelle (dieses Mal sollte die Transaktion fast leer sein)
- Daten von der Staging-Tabelle zurück in die Originaltabelle verschieben (dies würde einige Zeit dauern, da die Tabelle Indizes enthält)
- Löschen Sie die Staging-Tabelle
Sie schlagen vor, BCP zu verwenden, um Daten zwischen der Staging-Tabelle und der Originaltabelle zu verschieben.
Wenn Sie in die Tabelle event_log schauen ...
%Vor%.. Ich habe diese Fehlermeldung gefunden:
Die Sitzung wurde wegen eines übermäßigen Transaktionslogs beendet Speicherplatznutzung. Versuchen Sie, weniger Zeilen in einer einzelnen Transaktion zu ändern.
Danke für die Antwort! Eigentlich habe ich auch die Ursache gefunden.
Es gibt eine Lösung, ONLINE = ON, im Online-Modus wird die Indexerstellungsaufgabe in mehrere kleine Aufgaben aufgeteilt, so dass das T-Log 2 GB nicht überschreitet.
Aber es gibt eine Einschränkung, die 'include-Spalte' des Index-Erstellungsbefehls kann kein Objekt mit unbegrenzter Größe sein, wie nvarchar (max), falls dies der Fall ist, wird der Befehl sofort fehlschlagen.
Also in Sql Azure, für eine Indexerstellung wie folgt:
%Vor% Führen Sie die folgenden Aktionen aus, wenn die vorherige fehlgeschlagen ist.
1. Erstellen Sie den Index mit 'online = on'
2.wenn # 1 fehlgeschlagen ist, bedeutet entweder Spalte5 oder Spalte6 ist nvarchar (max), Abfrage der Tabellengröße, wenn & lt; 2GB, erstellen Sie direkt Index mit Online = off.
3.if # 2 scheitern, bedeutet Tischgröße & gt; 2GB, dann gibt es keine einfache Möglichkeit, Index ohne temporäre Tabelle beteiligt zu erstellen, müssen Maßnahmen ergreifen, wie ahkvk antwortete.
Tags und Links sql sql-server azure