SQL Server - tabele tymczasowe a fizyczne

14

W moim miejscu pracy następuje ruch, aby odejść od używania tabel #temp i zamiast tego używać stałych fizycznych tabel z identyfikatorami SPID. Ilekroć ktoś wcześniej WSTAWIŁO DO tabeli #temp, teraz INSERT INTO dbo.MyPermanentTable (SPID, ...) VALUES (@@SPID, ...)jest wymagane - wraz z wiązką DELETE FROM dbo.MyPermanentTable WHERE SPID = @@SPIDinstrukcji na początku np. Procedury składowanej. Ponadto nie trzeba dodawać, że wszędzie tam, gdzie używane są te „stałe tabele do przechowywania danych tymczasowych”, należy zachować ostrożność, aby dołączyć WHERE SPID = @@SPID.

Logika stojąca za przejściem do tej praktyki polega na tym, że poprawi ona ogólną wydajność serwera, na którym działają zapytania (poprzez zmniejszenie I / O i rywalizacji w tempdb). Nie podoba mi się to podejście z wielu powodów - jest brzydkie, potencjalnie niebezpieczne i wydaje się, że może zaszkodzić wydajności zapytań korzystających z nowego schematu.

Czy ktoś ma jakieś doświadczenie z tym lub podobnym podejściem do eliminowania tabel #temp?

Czy A
źródło

Odpowiedzi:

18

Można dość łatwo wykazać, że nie zmniejszy to IO ani rywalizacji, ale zamiast tego zwiększy oba.

  • IO : Każdy wiersz wstawiony, odczytany lub usunięty z tabeli #temp zostanie teraz wstawiony, odczytany lub usunięty z tabeli @@ SPID. Ale każdy wiersz będzie szerszy z dodatkową kolumną SPID @@, dlatego liczba potrzebnych stron nieznacznie wzrośnie, a liczba operacji zamówienia będzie jeszcze trochę większa. Ale co ważniejsze, upuszczenie tablicy #temp i zainicjowanie nowej sesji #temp tabeli przez sesję będzie teraz musiało zostać zasymulowane za pomocą DELETE FROM @@spidTable WHERE spid = @@SPID, a tym samym operacji obcinania / tworzenia (tj. Operacji zarządzania zasięgiem strony) zostaną przekształcone w operacjach rzędowych, nieporównywalnie wolniejszy.
  • Konkurencja : Każdy skan, który używał blokad strony w tabeli #temp, może teraz blokować stronę niepowiązanymi wierszami spid, tworząc w ten sposób wcześniej nieistniejącą rywalizację. Każda aktualizacja, która robi więcej, niż osiąga próg eskalacji blokady, ma możliwość eskalacji blokady do blokady tabeli, a tym samym blokowania każdego innego pająka.

Chociaż prawda jest taka, że ​​nie uderzysz w mityczną rywalizację IAM / SGAM / GAM w tempdb, jedynym powodem, dla którego tak się stanie, jest to, że twoje operacje staną się znacznie wolniejsze z powodu zwykłego dodatkowego IO i dodatkowej rywalizacji.

Remus Rusanu
źródło
Całkowicie zgadzam się z powyższym Remusem - i dziękuję za doskonałą odpowiedź. Problem polega na tym, że powodujemy rzekomy spadek wydajności w aplikacjach stron trzecich (z kilkoma bazami danych na serwerze, na którym mamy własną bazę danych - musimy wykonywać zapytania w stosunku do ich danych). Nadal uważam, że masz rację, myślę - jeśli chodzi o I / O, spodziewałbym się, że nowe podejście będzie działać znacznie gorzej niż poprzednio - jeśli chodzi o rywalizację, z punktu widzenia tempdbs będzie lepiej - z naszego, nieco gorzej.
Czy A
Ile masz plików tempdb? Standardowa konfiguracja tak naprawdę nie skaluje się wcale - powinieneś mieć wiele plików tempdb i logów, po jednym na widoczny rdzeń procesora (po 2 dla hyper-v).
TomTom
1
Musisz przeczytać dwa artykuły: sqlskills.com/BLOGS/PAUL/post/… i sqlskills.com/BLOGS/PAUL/post/…, ponieważ dotyczą one najczęściej występujących problemów ze skalowalnością tempdb.
Remus Rusanu
@TomTom whoa, whoa. Wiele plików dziennika? Naprawdę?
Aaron Bertrand
5

To wydaje się drastycznym rozwiązaniem. Istnieje wiele artykułów online na temat zmniejszania rywalizacji o tempdb (i optymalizacji jej wykorzystania) - czy Twoja organizacja dokładnie zbadała tę drogę?

http://www.sql-server-performance.com/tips/tempdb_p1.aspx

http://www.sqlservercentral.com/blogs/robert_davis/archive/2010/03/05/Breaking-Down-TempDB-Contention.aspx

http://searchsqlserver.techtarget.com/tip/Optimize-tempdb-in-SQL-Server-by-striping-and-splitting-to-multiple-files

itp.


źródło
+1 całkowicie się zgadza - zoptymalizuj tempdb, nie wymyślaj ponownie koła, ponieważ Twoja implementacja będzie gorsza. :)
Jestem za tym, że nie podążam tą ścieżką, jeśli nie jest to uzasadnione - dzięki za informacje Ben - zbadam i przedstawię sugestie naszemu DBA, jeśli to właściwe.
Czy A
2

Brzmi dla mnie jak powinno być rozwiązywanie problemów z wydajnością w ramach tempdb, istnieje kilka sugestii w tutaj

SPE109
źródło
Wygląda na użyteczne - dzięki SPE109, sprawdzę to i odpowiednio przedstawię zalecenia dla naszego DBA.
Czy A