Czy mogę poprawić wydajność rozdętych tabel systemowych?

12

Tło:
Mam liczne bazy danych z dużą liczbą WIDOKÓW i bardzo dużą liczbą SYNONYMÓW. Na przykład jeden plik db ma ponad 10 000 WIDOKÓW i ponad 2 miliony SYNONYMÓW.

Ogólny problem:
zapytania dotyczące sys.objects(i ogólnie tabel systemowych) są zwykle powolne. Kwerendy obejmujące sys.synonymssą glacjalne. Zastanawiam się, co mogę zrobić, aby poprawić wydajność.

Konkretny przykład
To polecenie jest uruchamiane przez narzędzie innej firmy. Jest wolny zarówno w aplikacji, jak i w SSMS:

exec sp_tables_rowset;2 NULL,NULL

Moje pytanie :
Jak mogę to przyspieszyć?

Co próbowałem :
Jeśli SET STATISTICS IO ONotrzymam ten wynik:

(Dotyczy 2201538 wierszy)
Tabela „sysobjrdb”. Liczba skanów 1, logiczne odczyty 28, fizyczne odczyty 0, odczyt z wyprzedzeniem 0, lob logiczne odczyty 0, lob fizyczne odczyty 0, lob odczyty z wyprzedzeniem 0.
Tabela „sysschobjs”. Liczba skanów 1, logiczne odczyty 53926, fizyczne odczyty 0, odczytywanie z wyprzedzeniem 0, lob logiczne odczyty 0, lob fizyczne odczyty 0, lob odczyty 0.

Udało mi się zaktualizować statystyki dotyczące bazowych tabel systemowych. Działa to w moim SQL 2008 R2 lub nowszych środowiskach:

UPDATE STATISTICS sys.sysobjrdb WITH FULLSCAN
UPDATE STATISTICS sys.sysschobjs WITH FULLSCAN

Byłem także w stanie przeprowadzić obsługę indeksu. Działa to w moim SQL 2012 lub nowszym środowisku. Na przykład uruchomienie sp_help 'sys.sysschobjs'identyfikuje indeksy w tabeli, a następnie tworzę i uruchamiam następujące polecenia:

ALTER INDEX clst ON sys.sysschobjs REORGANIZE
ALTER INDEX nc1 ON sys.sysschobjs REORGANIZE
ALTER INDEX nc2 ON sys.sysschobjs REORGANIZE
ALTER INDEX nc3 ON sys.sysschobjs REORGANIZE

Aktualizacja statystyk i reorganizacja indeksów pomaga, ale niewiele.

Dave Mason
źródło
Auć. Zgaduję, że robisz jakiś pomieszany typ wielu dzierżawców, utrzymując dane wszystkich w tych samych tabelach i filtrując je za pomocą widoków i używając synonimów, aby nazwać je po obiekcie podstawowym, na dużą skalę? Tak czy inaczej, współczuję tobie
Philᵀᴹ
2
Wielu najemców? Właściwie nie. To nie jest Całkiem popieprzone, prawda? FWIW, rozumiem, że dla każdego użytkownika aplikacji jest utworzonych 5 SYNONIMÓW dla każdej tabeli. Mam szczęście.
Dave Mason
Czy usunięcie uprawnień do niektórych z tych obiektów zwiększa wydajność (tak, że jest ich mniej do potencjalnego wykorzystania?) Nie wiem, czy jest to nawet opcja na poziomie użytkownika.
ConstantineK,
Interesujące byłoby zobaczyć w tym planie wykonania. może możesz napisać jedną z eksploratora planów sentry sql na stronie answer.sqlperformance.com i link do niej, chyba że istnieje sposób na osadzenie tego tutaj. Byłbym ciekawy, patrząc na to
SheldonH

Odpowiedzi:

1

Jeśli jeszcze tego nie zrobiłeś, możesz zwiększyć wydajność, przenosząc główny plik danych do oddzielnego zestawu wrzecion od reszty danych (zobacz Architektura plików i aplikacjami i SQL Server: grupa plików tylko dla tabel systemowych? ).

Ziggy Crueltyfree Zeitgeister
źródło
Myślę, że to dobra rada, jednak nie wpłynęłoby to na duży wpływ, jeśli konfiguracja IO nie jest standardowym fizycznym serwerem z dołączonymi dyskami, na przykład instancja wirtualna z SAN lub dyski SSD zminimalizowałyby zauważalny wpływ oddzielenia podstawowych plików danych w inne miejsce, prawda?
SheldonH
1
Jeśli masz kontrolę nad sprzętem (tzn. Nie jesteś hostowany przez stronę trzecią), możesz mieć różne zestawy wrzecion w sieci SAN (np. Dwa lub więcej oddzielnych woluminów RAID-10). Jeśli używasz (lub hostujesz) dysków SSD, nie ma wrzecion, a operacje wejścia / wyjścia byłyby ograniczone głównie przez to, co stanowi wąskie gardło między dyskami a płytą główną (tj. Kartę SATA, RAID lub NIC, okablowanie, routery / przełączniki , SAN, SSDs speed), więc nic nie zyskasz, oddzielając pliki w takim przypadku.
Ziggy Crueltyfree Zeitgeister