2009-02-21 13 views
14

Używam SQL Server 2005 jako magazynu danych dla wielu danych, w których pracuję analitycznie. To nie jest transakcyjna baza danych, ponieważ nie trafiam na nią aktualizacjami ani nie przechwytuję danych w czasie rzeczywistym. Dostaję kilka danych od moich klientów, ładuję je do SQL Server i wykonuję serię manipulacji. Następnie pobieram fragmenty tych danych i przeciągam je do R, gdzie wykonuję większość moich analiz. Następnie przesyłaję trochę danych do tabel w SQL Server i może zrobić połączenie lub dwa.Ułatw serwer SQL Server w manipulowaniu danymi - wyłącz rejestrowanie transakcji?

Mam sporo czasu, gdy dzienniki w SQL Server stają się coraz większe i zakładam, że ich utworzenie wymaga pewnego stopnia narzutu. Jak mogę skonfigurować program SQL Server tak, aby działał z małym rejestrem lub bez logowania? Jeśli rzeczy ulegną uszkodzeniu, cieszę się, że zaczynam od początku. Wszelkie pomysły, jak zrobić to wszystko szybciej?

BTW, nie trzeba mi mówić, jak zmniejszyć logi, już to robię. Ale szkoda, że ​​nie musiałem robić dzienników w pierwszej kolejności. Używam DB tylko do przechowywania danych, ponieważ jest zbyt duży, aby zmieścić się w pamięci w R.

Czy powinienem używać prostszego DB niż Sql Server? Możesz mi powiedzieć, że zabijam mrówkę młotem kowalskim. Ale proszę polecić młot o odpowiedniej wielkości. :)

+0

Dlaczego chcesz być restrykcyjna ze stratami plików bazy danych: http://www.karaszi.com/SQLServer/info_dont_shrink.asp – JohnB

Odpowiedz

9

Jak skonfigurować program SQL Server tak, aby działał z niewielkim rejestrem lub bez logowania? I

Nie wierzę, że możesz.

Jeśli jednak skonfigurujesz bazę danych (każda baza danych na serwerze może być różna) dla prostych kopii zapasowych plik dziennika nie będzie się rozwijał, dopóki go nie utworzysz. Odbywa się to poprzez ustawienie trybu odzyskiwania na "prosty".

W przypadku prostych kopii zapasowych dziennik służy wyłącznie do przechowywania stanu transakcji, dopóki nie zostaną w całości zapisane w głównej bazie danych.

+0

To może być to, co muszę zrobić. Dzięki za naprawdę szybką odpowiedź. –

5

Można zminimalizować zużycie dzienników na serwerze SQL, zmieniając model odzyskiwania bazy danych na prosty, patrz link. Skoro nie zajmujesz się współbieżnością, a transakcje uważasz za Microsoft Access?

+0

Przeprowadziłem się do SQL Server, ponieważ regularnie waliłem w głowę o limit 2 GB w programie Access. Prawie zadałem to pytanie w formie "jak mogę przekonać program SQL Server do działania bardziej podobnego do Access", ale bałem się, że otrzymam wiele BS o tym, jak Access sucks, yada yada. Potrzebuję tylko dobrego magazynu danych! –

+0

Czy możesz podzielić swoje dane na kilka plików baz danych programu Access? Połączona semantyka tabeli w programie Access bardzo ułatwiłaby logiczne ustawienie głównego pliku odwołującego się do kilku plików danych dostępu dziecka. – James

+1

Dobry pomysł, ale uwzględnienie wielu tablic Access będzie całkowitym kludge, które utrudniają analizę. Mając to w SQL Server pozwala mi również przesłać drogie zapytania do bardziej wydajnego serwera. Dostęp wymagałby ode mnie wykonania tych zapytań na komputerze klienta. –

2

Aby zminimalizować rejestrację, użyj prostego modelu odzyskiwania i wykonuj swoją pracę partiami.

+0

Ja ponownie czytałem te odpowiedzi i wspomniałem o partiach, które wpadły mi w oko. Czy możesz dać mi lepszy wgląd w to, co masz na myśli, robiąc rzeczy w partiach? Czy wykonanie długiego skryptu z 30 krokami różni się od uruchamiania 30 skryptów? Dzięki za pomoc. –

+0

według partii, co oznacza na przykład, jeśli musisz zaktualizować/usunąć 50.000 wierszy, zrobić to w partiach po 1000. i każdej partii w swojej własnej transakcji. możesz to zrobić z pętlą while. w przypadku wkładek można używać funkcji wstawiania zbiorczego. –

+1

w świecie rzeczywistym, przynajmniej w Oracle (ouch!), Zawsze szybciej przetwarzać dane jako kompletny zestaw, nie rozdzielając go na mniejsze fragmenty. COMMITs wykonują pracę, podobnie jak rozpoczynające się i kończące transakcje. Kolejną radą jest to, że najszybszym sposobem aktualizacji WSZYSTKICH (lub większości) wierszy w tabeli jest utworzenie nowej tabeli. –

6

Jednym ze sposobów uniknięcia rejestrowania podczas pracy z dużymi zbiorami danych jest użycie SELECT/INTO. Utworzy on nową tabelę, ale żadna z nich nie zostanie zarejestrowana.

Jest kilka rzeczy, na które trzeba uważać w ten sposób:

  • kolumny obliczane stają się regularne kolumny danych
  • indeksowania i tożsamości kolumn musiałyby być ustalone zbyt

Kiedy właściwie to zrobić może zaoszczędzić nie tylko miejsce, ale i czas przetwarzania.

Alternatywą jest coś, co robię teraz, jako przykład:

UPDATE [MyTable] 
SET [Message] = REPLACE([Message], N'Content_Type', N'Content-Type') 

działa dobrze, ale aktualizuje cały stół tworząc jeden wielki zbiór transakcji, a nie można zrobić:

DECLARE @IDs TABLE ([id] int) 
DECLARE @Batch TABLE ([id] int) 

INSERT INTO @IDs ([ID]) SELECT [ID] FROM [MyTable] 

WHILE EXISTS (SELECT TOP 1 [ID] FROM @IDs) 
BEGIN 
    INSERT INTO @Batch ([ID]) SELECT TOP 1000 [Id] FROM @IDS 

    UPDATE [MyTable] 
    SET [Message] = REPLACE([Message], N'Content_Type', N'Content-Type') 
    WHERE [Id] IN (SELECT [Id] FROM @Batch) 

    DELETE @IDs WHERE [Id] IN (SELECT [Id] FROM @Batch) 
    DELETE @Batch 
END 

Aktualizuje tabelę 1000 wierszy jednocześnie, zmniejszając rozmiar transakcji.

3

Nie sprawisz, że serwer SQL Server będzie prawie szybszy, wyłączając rejestrowanie transakcji, ale rozmiar dziennika można zmniejszyć, przechodząc do prostego lub zbiorczego trybu odzyskiwania, jak już sugerowali inni.

Podejrzewam, że nigdy nie należy włączać trybu pełnego przywracania, z wyjątkiem szczególnych przypadków, takich jak twoje, gdy nie jest to konieczne.

Głównym powodem tego jest to, że dziennik transakcji w pełnej odzysku może być jedyną szansą na odzyskanie w przypadku przypadkowego wykonania aktualizacji, usunięcia lub TRUNCATE, gdy nie masz kopii zapasowych lub wszystkie dane nie znajdują się w kopiach zapasowych.

Istnieje kilka wątków na ten temat, w których odczyt dziennika transakcji był ostatnią nadzieją na odzyskanie.

How can I rollback an UPDATE query in SQL server 2005?

How to undo a delete operation in SQL Server 2005?

Ponownie, w konkretnym przypadku to nie jest chyba problem, ale wydaje mi się, że może to być przydatne dla innych.

-1

Kod użyciu EntityFramework skonfigurować bazę danych jak Richards odpowiedź opisuje:

using (var dbInstance = new YourEntityFrameworkDB_Context()) 
{ 
    var sqlConfigConn = dbInstance.Database.Connection as SqlConnection; 
    sqlConfigConn.Open(); 

    using (var sqlCmd = new SqlCommand()) 
    { 
     sqlCmd.Connection = sqlConfigConn as SqlConnection; 
     sqlCmd.CommandText = String.Format("ALTER DATABASE model SET RECOVERY SIMPLE"); 
     var result = sqlCmd.ExecuteNonQuery(); 
    } 
    sqlConfigConn.Close(); 
} 

i sprawdzić, czy to był udany prostu zacząć Management Studio i uruchomić: Screenshot Management Studio


EDIT lut 2018:

MSDN opis abo ut modelu odzyskiwania

╔══════════╦══════════════════════╦══════════════════════════════════════════╗ 
║ Recovery ║ Description  ║  Recover to a point in time?   ║ 
║ model ║      ║           ║ 
╠══════════╬══════════════════════╬══════════════════════════════════════════╣ 
║ Simple ║ No log backups  ║ Can recover only to the end of a backup. ║ 
║   ║      ║           ║ 
║ Full  ║ Requires log backups ║ Can recover to a specific point in time, ║ 
║   ║      ║ assuming that your backups are complete ║ 
║   ║      ║ up to that point in time.    ║ 
║   ║      ║           ║ 
║ Bulk  ║ Requires log backups ║ Can recover to the end of any backup. ║ 
║ logged ║      ║           ║ 
╚══════════╩══════════════════════╩══════════════════════════════════════════╝ 
Powiązane problemy