Baza danych SQL Server na dysku SSD - korzyść dla osobnego pliku dla każdej tabeli?

19

Tworzę bazę danych, w której będzie około 30 tabel, z których każda zawiera dziesiątki milionów wierszy, a każda tabela zawiera jedną ważną kolumnę i kolumnę klucza głównego / obcego, aby zmaksymalizować wydajność zapytań w obliczu dużego aktualizacje i wstawienia oraz intensywne wykorzystanie indeksów klastrowych. Dwie tabele będą zawierać dane tekstowe o zmiennej długości, jedna z nich zawiera setki milionów wierszy, a reszta będzie zawierać tylko dane liczbowe.

Ponieważ naprawdę chcę wycisnąć każdą ostatnią kroplę wydajności z dostępnego sprzętu (około 64 GB pamięci RAM, bardzo szybki dysk SSD i 16 rdzeni), zastanawiałem się nad zezwoleniem, aby każda tabela miała własny plik, więc nie ważne, czy Dołączam do 2, 3, 4, 5 lub więcej tabel, każda tabela będzie zawsze czytana za pomocą osobnego wątku, a struktura każdego pliku będzie ściśle dopasowana do zawartości tabeli, co, mam nadzieję, zminimalizuje fragmentację i przyspieszy jej działanie dla SQL Server, aby dodać do zawartości dowolnej tabeli.

Jedno zastrzeżenie, utknąłem na SQL Server 2008 R2 Web Edition . Co oznacza, że ​​nie mogę korzystać z automatycznego partycjonowania poziomego, co wyklucza to zwiększenie wydajności.

Czy użycie jednego pliku na tabelę faktycznie maksymalizuje wydajność, czy też pomijam cechy wbudowanego silnika SQL Server, które spowodowałyby, że byłoby to zbędne?

Po drugie, jeśli korzystanie z jednego pliku na tabelę jest korzystne, dlaczego create tabledaje mi tylko opcję przypisania tabeli do grupy plików, a nie do określonego pliku logicznego? Wymagałoby to ode mnie utworzenia osobnej grupy plików dla każdego pliku w moim scenariuszu, co sugeruje mi, że być może SQL Server nie przewiduje korzyści, które, jak zakładam, wynikałyby z robienia tego, co proponuję.

Nathan Ridley
źródło

Odpowiedzi:

18

Myślałem o umożliwieniu każdej tabeli posiadania własnego pliku, więc bez względu na to, czy dołączę do 2, 3, 4, 5 lub więcej tabel, każda tabela będzie zawsze czytana przy użyciu osobnego wątku, a struktura każdego pliku będzie być ściśle dopasowane do zawartości tabeli, co, miejmy nadzieję, zminimalizuje fragmentację i przyspieszy dodawanie SQL Server do zawartości dowolnej tabeli

O czym ty do diabła mówisz? Nie jestem pewien, skąd masz informacje, ale z pewnością powinieneś odrzucić to źródło. Nic z tego, co tutaj zakładasz, nie jest poprawne.

Jeśli chcesz przeczytać dobrą dyskusję na temat wydajności dysku SSD dla programu SQL Server, istnieje kilka serii blogów. Jak zwykle, Paul Randal jest na górze:

Brent ma również niezłą prezentację na ten temat: SQL na dyskach SSD: Hot and Crazy Love i jest ich więcej.

Przeglądając wszystkie te prezentacje, szybko zauważysz, że wszystkie koncentrują się na pisaniu, ponieważ tutaj właśnie pojawia się wydajność dysków SSD. Twoje sformułowania w postach dotyczą prawie wyłącznie przeczytań, co jest innym tematem. Jeśli odczuwasz trudności z odczytami, powinieneś mówić o pamięci RAM, a nie o dyskach SSD oraz o odpowiednich strategiach indeksowania i zapytań.

Remus Rusanu
źródło
1
Tak, podałem gdzieś niewłaściwe informacje, ale tak jak skomentowałem odpowiedź Stuarta, zadałem pytanie, aby upewnić się, że nie opieram swoich decyzji na błędnych informacjach. Dzięki za linki, sprawdzę je.
17

Moją pierwszą sugestią byłoby, aby nie przyjmować żadnych założeń dotyczących wydajności bez przeprowadzania testów obciążenia dla obu konfiguracji.

Domyślam się, że w przeszłości widziałem takie konfiguracje (które mają sens na papierze), że umieszczenie każdej tabeli w osobnym pliku nie miałoby wymiernego pozytywnego wpływu na wydajność ... i że dodatkowa złożoność zrównoważyłaby wszelki wzrost wydajności nawet jeśli były mierzalne.

Wreszcie, jeśli chodzi o wyciskanie każdej kropli wydajności z serwera Sql, odsyłam do poniższej tabeli (pod warunkiem mojego Microsoft):

wprowadź opis zdjęcia tutaj

Wszelkie potencjalne optymalizacje, które mogą być wykonane z perspektywy aplikacji, łatwo przyćmią wszelkie możliwe optymalizacje na poziomie konfiguracji sprzętowej / bazy danych ... więc odpowiednio skoncentruj swoją uwagę.

Michael Fredrickson
źródło
Oczywiście. Jednak w moim przypadku optymalizowałem cały system tak bardzo, jak potrafię, a głównym wąskim gardłem, które mam teraz, jest bardzo duża szybkość zapytań w obliczu częstych aktualizacji, usuwania i wstawiania. Ponieważ zamierzam wykorzystać program SQL Server do rozwiązania tego problemu, chcę się upewnić, że daję mu absolutnie najlepszą możliwą możliwość działania na moich danych tak szybko, jak to możliwe.
@NathanRidley Ok, zrozumiałem ... Myślę, że prawdziwa odpowiedź, chyba że ktoś ma zasoby mówiące „nigdy tego nie rób”, że najlepszym rozwiązaniem byłoby porównanie dwóch konfiguracji z typowym obciążeniem i sprawdzenie, czy istnieje wymierna różnica.
Michael Fredrickson
4

Jak zauważyli inni, nie ma bezpośrednich korzyści z jednego pliku na tabelę; oto świetne streszczenie od Steve'a Jonesa na temat powstania tego mitu: http://www.sqlservercentral.com/blogs/steve_jones/2009/10/13/sql-server-legend-data-files-and-threads/

Możesz również sprawdzić widok podzielony na partycje, który moim zdaniem jest obsługiwany przez 2008 Web Edition. Istnieje kilka sztuczek kodowania w widoku podzielonym na partycje, ale stosunkowo łatwo można naśladować wiele funkcji tabel podzielonych na partycje.

Stuart Ainsworth
źródło
2

Myślę, że osobne pliki dla każdej tabeli nie przyniosłyby żadnej poprawy wydajności. Prawidłowe indeksy mogą potencjalnie zwiększyć wydajność (odczyt dysku) na serwerze bazy danych.

Czy SQL Server 2008 R2 obsługuje kompresję? Jeśli tak, włącz to.

Popraw mnie, jeśli się mylę.

Peter Kiss
źródło
Czy mógłbyś wyjaśnić, dlaczego nie byłoby żadnej korzyści z wydajności? Przynajmniej wyjaśnij, dlaczego tak się dzieje, gdy osobne pliki umożliwiają SQL Serverowi używanie wielu wątków do odczytu.
Jeśli umieścisz całą tabelę we własnej grupie plików, ale na tym samym dysku, wydajność będzie równa przed partycjonowaniem. Ale jeśli oddzielasz niektóre tabele do ich grup plików na innym, szybszym dysku, zwiększy to wydajność. Możesz także podzielić na partycje na przykład według roku, jeśli masz dużo danych, które zależą od roku. Dzięki tej technice możesz przechowywać najczęściej używane dane na szybszym dysku niż na starych. Możesz także oddzielić indeksy, ale tylko jeśli umieścisz je na nowym dysku fizycznym, będzie to miało wpływ na wydajność.
Masz rację co do równoległych wątków (tabel / plików), ale myślę, że dopóki nie będziesz mieć tylko jednego dysku fizycznego, wzrost wydajności będzie niewielki.
I zalecam, abyś dostał mocną macierz HDD RAID dla bazy danych, ponieważ SSD wkrótce umrze.