背景:
多数のVIEWと非常に多数のSYNONYMを持つ多数のデータベースがあります。たとえば、1つのデータベースには1万個以上のVIEWと2百万個以上のSYNONYMがあります。
一般的な問題:(および一般的なシステムテーブル)
を含むクエリはsys.objects
遅くなる傾向があります。関係sys.synonyms
するクエリは氷河期です。パフォーマンスを改善するために何ができるか疑問に思っています。
特定の例
このコマンドは、サードパーティツールによって実行されます。アプリとSSMSの両方で遅い:
exec sp_tables_rowset;2 NULL,NULL
私の質問:
この実行を高速化するにはどうすればよいですか?
試したこと:この出力が得られた
場合SET STATISTICS IO ON
:
(2201538行が影響を受けます)
テーブル 'sysobjrdb'。スキャンカウント1、論理読み取り28、物理読み取り0、先読み読み取り0、lob論理読み取り0、lob物理読み取り0、lob先読み0。
テーブル 'sysschobjs'。スキャンカウント1、論理読み取り53926、物理読み取り0、先読み読み取り0、lob論理読み取り0、lob物理読み取り0、lob先読み読み取り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
統計の更新とインデックスの再編成は役立ちますが、大したことではありません。