sql azure zeitaufwendige Abfrage

8

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!

    
mbmaster 23.04.2014, 01:48
quelle

2 Antworten

8

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:

     
  1. 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)
  2.   
  3. verschiebt die Daten aus der Originaltabelle in eine Staging-Tabelle (die Einfügung       ist schneller, weil die Staging-Tabelle ein Heap ist)
  4.   
  5. leere die ursprüngliche Tabelle
  6.   
  7. Erstellen Sie den Index für die ursprüngliche Tabelle (dieses Mal sollte die Transaktion fast leer sein)
  8.   
  9. Daten von der Staging-Tabelle zurück in die Originaltabelle verschieben (dies würde einige Zeit dauern, da die Tabelle Indizes enthält)
  10.   
  11. Löschen Sie die Staging-Tabelle
  12.   

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.

    
andersh 19.05.2014, 08:19
quelle
2

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.

    
mbmaster 16.07.2014 03:18
quelle

Tags und Links