Contexte:
J'ai de nombreuses bases de données avec un grand nombre de VUES et un très grand nombre de SYNONYMES. Par exemple, une base de données a plus de 10 000 VIEW et plus de 2 millions de SYNONYMES.
Problème général: les
requêtes impliquant sys.objects
(et les tables système en général) ont tendance à être lentes. Les requêtes impliquant sys.synonyms
sont glaciaires. Je me demande ce que je peux faire pour améliorer les performances.
Exemple spécifique
Cette commande est exécutée par un outil tiers. Il est lent à la fois dans l'application et dans SSMS:
exec sp_tables_rowset;2 NULL,NULL
Ma question :
comment puis-je accélérer cette course?
Ce que j'ai essayé :
si SET STATISTICS IO ON
j'obtiens cette sortie:
(2201538 ligne (s) affectée (s))
Table 'sysobjrdb'. Nombre de balayages 1, lectures logiques 28, lectures physiques 0, lectures anticipées 0, lectures logiques 0, lob lectures physiques 0, lob lectures anticipées 0.
Table 'sysschobjs'. Nombre de balayages 1, lectures logiques 53926, lectures physiques 0, lectures anticipées 0, lectures logiques 0, lob lectures physiques 0, lob lectures anticipées 0.
J'ai pu mettre à jour les statistiques sur les tables système sous-jacentes. Cela a fonctionné dans mes environnements SQL 2008 R2 ou plus récents:
UPDATE STATISTICS sys.sysobjrdb WITH FULLSCAN
UPDATE STATISTICS sys.sysschobjs WITH FULLSCAN
J'ai également pu effectuer la maintenance d'index. Cela fonctionne dans mes environnements SQL 2012 ou plus récents. Par exemple, l'exécution sp_help 'sys.sysschobjs'
identifie les index sur la table, et à partir de là, je crée et exécute ces commandes:
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
La mise à jour des statistiques et la réorganisation des index sont utiles, mais pas beaucoup.