Справочная информация: У
меня есть многочисленные базы данных с большим количеством VIEW и чрезвычайно большим количеством SYNONYM. Например, один дБ имеет более 10 000 просмотров и более 2 миллионов синонимов.
Общая проблема:
Запросы с участием sys.objects
(и системных таблиц в целом), как правило, медленные. Запросы с участием sys.synonyms
являются ледниковыми. Мне интересно, что я могу сделать, чтобы улучшить производительность.
Конкретный пример
Эта команда запускается сторонним инструментом. Это медленно как в приложении, так и в SSMS:
exec sp_tables_rowset;2 NULL,NULL
Мой вопрос :
как я могу сделать это быстрее?
Что я пробовал :
если SET STATISTICS IO ON
я получаю этот вывод:
(Затронуты строки 2201538)
Таблица 'sysobjrdb'. Сканирование 1, логическое чтение 28, физическое чтение 0, чтение с опережением 0, чтение логического объекта 0, чтение с физического объекта 0, чтение с опережением 0.
Таблица 'sysschobjs'. Сканирование 1, логическое чтение 53926, физическое чтение 0, чтение с опережением 0, логическое чтение с 0, физическое чтение с 0, чтение с опережением 0.
Мне удалось обновить статистику по базовым системным таблицам. Это работало в моей SQL 2008 R2 или более новых средах:
UPDATE STATISTICS sys.sysobjrdb WITH FULLSCAN
UPDATE STATISTICS sys.sysschobjs WITH FULLSCAN
Я также был в состоянии выполнить обслуживание индекса. Это работает в моем SQL 2012 или более новых средах. Например, запуск работает, sp_help 'sys.sysschobjs'
идентифицирует индексы в таблице, и оттуда я создаю и запускаю эти команды:
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
Обновление статистики и реорганизация индексов помогает, но не намного.