2010-02-26 12 views
12

Buduję system do aktualizowania dużych ilości danych poprzez różne kanały CSV. Zwykle po prostu pętlę po każdym wierszu w kanale, wykonaj kwerendę wyboru, aby sprawdzić, czy element już istnieje i wstaw/zaktualizuj element w zależności, czy istnieje, czy nie.Najlepsze praktyki dotyczące wstawiania/aktualizowania dużej ilości danych w SQL Server 2008

Uważam, że ta metoda nie jest bardzo skalowalna i może wpłynąć na serwer przy większych plikach. Moim rozwiązaniem jest przeglądanie elementów w normalny sposób, ale przechowuj je w pamięci. Następnie za każde 100 lub więcej elementów wybierz jedną z tych 100 pozycji i uzyskaj listę istniejących elementów w bazie danych, które pasują do siebie. Następnie połącz instrukcje insert/update razem i uruchom je w bazie danych. Zasadniczo ograniczyłoby to liczbę podróży do bazy danych.

Czy jest to wystarczająco skalowalne rozwiązanie i czy istnieją przykładowe samouczki dotyczące importowania dużych plików do wydajnego środowiska?

Dzięki

Odpowiedz

13

Widząc, że używasz SQL Server 2008, polecam tej metody:

  • pierwszy bulkcopy plików CSV do tabeli tymczasowej
  • zaktualizować tabelę docelową z tej tabeli tymczasowej przy użyciu polecenia MERGE

Zapoznaj się z MSDN docs i great blog post, jak korzystać z polecenia MERGE.

Zasadniczo, można utworzyć powiązanie między rzeczywistą tabeli danych i tabeli tymczasowej w sprawie wspólnych kryteriów (np wspólny klucz podstawowy), a następnie można określić, co zrobić, gdy

  • wiersze zgodne, na przykład wiersz istnieje zarówno w tabeli źródłowej, jak i docelowej -> zazwyczaj można zaktualizować niektóre pola lub po prostu zignorować je wszystkie razem
  • wiersz ze źródła nie istnieje w celu -> zazwyczaj jest to przypadek dla INSERT

to masz MERGE oświadczenie coś takiego:

MERGE TargetTable AS t 
USING SourceTable AS src 
ON t.PrimaryKey = src.PrimaryKey 

WHEN NOT MATCHED THEN 
    INSERT (list OF fields) 
    VALUES (list OF values) 

WHEN MATCHED THEN 
    UPDATE 
    SET (list OF SET statements) 
; 

oczywiście klauzula ON może być o wiele bardziej zaangażowany w razie potrzeby. Oczywiście, twoje instrukcje WHEN mogą być również bardziej złożone, np.

WHEN MATCHED AND (some other condition) THEN ...... 

i tak dalej.

MERGE to bardzo wydajne i bardzo przydatne nowe polecenie w SQL Server 2008 - użyj go, jeśli możesz!

0

Innym rozwiązaniem byłoby napisać procedurę przechowywaną na serwerze .NET na serwerze do działania na cały plik ...

Tylko jeśli potrzebujesz więcej kontroli niż rozwiązania Kris Krause chociaż - Jestem wielkim Wachlarz utrzymania go w prostocie (i wielokrotnego użytku), gdzie możemy ...

0

Czy w ogóle trzeba tu wjeżdżać? Czy byłoby możliwe dostarczenie danych w taki sposób, że SQL Server może użyć importu zbiorczego, aby załadować go, a następnie zająć się duplikatami w bazie danych po zakończeniu importowania?

Jeśli chodzi o podnoszenie ciężarów z dużą ilością danych, moim zdaniem wydaje się, że praca w bazie danych w jak największym stopniu jest znacznie szybsza i wymaga mniej zasobów.

2

Twoja droga jest najgorszym możliwym rozwiązaniem. Ogólnie rzecz biorąc, nie powinieneś myśleć w kategoriach zapętlenia rekordów indywidualnie. Kiedyś mieliśmy firmowe narzędzie do importowania, które pętało się przez reciords, załadowanie pliku z ponad milionem rekordów zajęłoby 18-20 godzin (coś, co nie było częstym przypadkiem, gdy zostało zbudowane, ale które jest wielokrotnie dzień dzisiejszy).

Widzę dwie opcje: Wkładanie zbiorcze pierwszego użycia do załadowania do stołu pomostowego i zrobienie tego, co należy zrobić na tym stole. Jak oceniasz, czy rekord istnieje? Powinieneś być w stanie zbudować aktualizację opartą na zestawie, dołączając do tabeli pomostowej w tych polach, które określają aktualizację. Często mam dodaną kolumnę do mojej tablicy pomostowej dla identyfikatora rekordu, do którego pasuje i zapełniłem ją poprzez zapytanie, a następnie wykonałem aktualizację. Następnie robisz wstawienie rekordów, które nie mają odpowiedniego identyfikatora. Jeśli masz zbyt wiele rekordów do zrobienia wszystkich na raz, możesz chcieć uruchomić partie (co tak jest w pętli), ale sprawić, by partie były znacznie większe niż 1 rekord na raz (zwykle zaczynam od 2000, a następnie na podstawie czas potrzebny na określenie, czy mogę zrobić więcej lub mniej w partii).

Wydaje mi się, że rok 2008 zawiera również informację o połączeniu, ale nie miałem jeszcze okazji jej użyć. Sprawdź to w książkach online.

Alternatywą jest użycie SSIS, który jest zoptymalizowany pod kątem prędkości.SSIS to jednak skomplikowana sprawa, a krzywa uczenia się jest bardzo stroma.

+0

+1 za użycie WSTAWIENIA I WZMOCNIENIA BULKOWEGO –

+0

Dzięki za sugestię. Powodem, dla którego przechodzę przez każdy element, jest to, że muszę wykonać jakąś procedurę sprawdzania poprawności i formatowania przed dodaniem go do bazy danych. Następnie przekaże je użytkownikowi, jeśli wystąpią jakiekolwiek problemy z samym plikiem danych. Podoba mi się pomysł połączenia danych, ale przyjrzę się temu. – markvpc

+0

Możesz także z łatwością sprawdzać poprawność i formatowanie w sposób oparty na ustawieniach. Zapętlanie poszczególnych rekordów jest prawie zawsze złym wyborem i nie powinieneś zastanawiać się nad tym, dopóki wszystkie inne opcje nie zostaną wyeliminowane. – HLGEM

Powiązane problemy