既存のデータベースの SQL Server 管理オブジェクトの走査を高速化する方法はありますか?

StackOverflow https://stackoverflow.com/questions/401740

  •  03-07-2019
  •  | 
  •  

質問

現在、SMO と C# を使用してデータベースを横断し、2 つのデータベースのさまざまな側面を表す設定のツリーを作成し、これらのツリーを比較してどこがどのように異なるかを確認しています。

問題は、2 つの適度なサイズのデータ​​ベースの場合、それらをローカルでクロールして、比較したいテーブル、列、ストアド プロシージャの情報を収集するのにほぼ 10 分かかることです。

このような方法でデータベースにアクセスするための SMO よりも優れたインターフェイスはありますか?追加の依存関係は含めたくないのですが、速度を 50% 向上させるためにはその苦労を引き受けます。以下は、テーブルと列を列挙する方法のサンプルです。

        Microsoft.SqlServer.Management.Smo.Database db = db_in;
        foreach (Table t in db.Tables)
        {
            if (t.IsSystemObject == false)
            {

                foreach (Column c in t.Columns)
                {
                }                    
            }
        }
役に立ちましたか?

解決

SMO がアクセス時にクエリを実行するのではなく、すべての必須フィールドを一度に読み取るように強制してください。見る このブログ 詳細については


編集:リンク切れてたけど見つけた ページ archive.org で。関連するコードは次のとおりです。

Server server = new Server();

// Force IsSystemObject to be returned by default.
server.SetDefaultInitFields(typeof(StoredProcedure), "IsSystemObject");

StoredProcedureCollection storedProcedures = server.Databases["AdventureWorks"].StoredProcedures;

foreach (StoredProcedure sp in storedProcedures) {
    if (!sp.IsSystemObject) {
        // We only want user stored procedures
    }
}

他のヒント

各データベースのシステム ビューを使用し、従来どおりにクエリを実行します。

http://www.microsoft.com/downloads/details.aspx?familyid=2EC9E842-40BE-4321-9B56-92FD3860FB32&displaylang=ja

TSQL クエリで取得できないものはほとんどありません。通常、この方法でメタデータを取得するのは非常に高速です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top