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.synonyms
są 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 ON
otrzymam 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.
źródło
Odpowiedzi:
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? ).
źródło