Antecedentes:
Eu tenho vários bancos de dados com um grande número de VIEW e um número extremamente grande de SYNONYM. Por exemplo, um banco de dados possui mais de 10k VIEW e mais de 2 milhões de SYNONYMs.
Problema geral: as
consultas que envolvem sys.objects
(e as tabelas do sistema em geral) tendem a ser lentas. As consultas que envolvem sys.synonyms
são glaciais. Gostaria de saber o que posso fazer para melhorar o desempenho.
Exemplo específico
Este comando é executado por uma ferramenta de terceiros. É lento no aplicativo e no SSMS:
exec sp_tables_rowset;2 NULL,NULL
Minha pergunta :
Como posso fazer isso funcionar mais rápido?
O que eu tentei :
Se SET STATISTICS IO ON
eu receber essa saída:
(2201538 linhas afetadas)
Tabela 'sysobjrdb'. Contagem de varredura 1, leituras lógicas 28, leituras físicas 0, leituras antecipadas 0, leituras lógicas 0, lob leituras físicas 0, leituras físicas lob 0, leituras antecipadas lob 0,
tabela 'sysschobjs'. Contagem de varredura 1, leituras lógicas 53926, leituras físicas 0, leituras antecipadas 0, leituras lógicas lob 0, leituras físicas lob 0, leituras físicas lob 0, leituras antecipadas lob.
Consegui atualizar as estatísticas nas tabelas subjacentes do sistema. Isso funcionou nos meus SQL 2008 R2 ou em ambientes mais recentes:
UPDATE STATISTICS sys.sysobjrdb WITH FULLSCAN
UPDATE STATISTICS sys.sysschobjs WITH FULLSCAN
Também pude executar a manutenção do índice. Isso funciona no meu SQL 2012 ou em ambientes mais recentes. Por exemplo, a execução sp_help 'sys.sysschobjs'
identifica os índices na tabela e a partir daí eu crio e executo estes comandos:
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
Atualizar estatísticas e reorganizar índices ajuda, mas não muito.