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 table
daje 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ę.
źródło
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):
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ę.
źródło
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.
źródło
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ę.
źródło