2016-09-19 8 views
0

Ich habe eine Tabelle, die abgeschnitten und geladen mit Daten jeden Tag das Problem ist das Abschneiden der Tabelle dauert eine Weile und Benutzer bemerken dies. Was ich mich wundere ist, gibt es eine Möglichkeit, zwei der gleichen Tabellen zu haben und zu verkürzen, dann laden Sie die neuen Daten und dann haben die Benutzer Benutzer diese neue Tabelle und einfach weiter zwischen den beiden Tabellen wechseln.SQL Server-Tabelle tauschen

+2

Es gibt eine Menge super intelligente und erfahrene Leute hier. Wenn Sie genauer erläutern, was Sie speichern, warum es gespeichert wird und warum Sie es abschneiden, erhalten Sie viel nützlichere Antworten. Fügen Sie auch eine beliebige Sprache/Software/Version ein. – Kieveli

+0

Obwohl "TRUNCATE" schnell ist, wird eine Schema-Modifikationssperre benötigt; Es wird durch gleichzeitige Aktivität blockiert und umgekehrt. Gleiches gilt für 'SWITCH', das als Teil eines Swap-Designs verwendet werden kann. Die Oberseite mit "SWITCH" ist, dass die Last getrennt auftreten kann. –

+0

Vielleicht könnten Sie das mit einem Synonym tun. Lassen Sie die Benutzer nur das Synonym kennen und schalten Sie das von einer Tabelle zur anderen – Turo

Antwort

0

Wenn Sie die alte Tabelle löschen, können Sie auch die OUTPUT-Klausel verwenden. Denken Sie an das Potential für logisches Wachstum, denken Sie an einen Loop/Batch-Ansatz, wenn dies ein Problem sein könnte.

DELETE 
    OldDatabase.dbo.MyTable 
OUTPUT 
    DELETED.col1 
    , DELETED.col2 
    , DELETED.col3 
INTO 
    NewDatabase.dbo.MyTable 

Oder Sie können BCP verwenden, die eine handliche Alternative zu beachten ist. Beachten Sie, dass dies die SQLCMD-Syntax verwendet.

:setvar SourceServer OldServer 
:setvar SourceDatabase OldDatabase 
:setvar DestinationServer NewServer 
:setvar DestinationDatabase NewDatabase 
:setvar BCPFilePath "C:\" 

!!bcp "$(SourceDatabase).dbo.MyTable" FORMAT nul -S "$(SourceServer)" -T -n -q -f "$(BCPFilePath)MyTable.fmt" 
!!bcp "SELECT * FROM $(SourceDatabase).dbo.MyTable WHERE col1=x AND col2=y" queryout "$(BCPFilePath)MyTable.dat" -S "$(SourceServer)" -T -q -f "$(BCPFilePath)MyTable.fmt" -> "$(BCPFilePath)MyTable.txt" 
!!bcp "$(DestinationDatabase).dbo.MyTable" in $(BCPFilePath)MyTable.dat -S $(DestinationServer) -T -E -q -b 2500 -h "TABLOCK" -f $(BCPFilePath)MyTable.fmt