Передумови: У
мене є чимало баз даних з великою кількістю VIEW та надзвичайно великою кількістю SYNONYM. Наприклад, один db має більше 10 кб оглядів і 2+ млн. SYNONYM.
Загальна проблема:
Запити, що стосуються 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 зчитування 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
Оновлення статистики та реорганізація індексів допомагає, але не набагато.