既存のデータベースの SQL Server 管理オブジェクトの走査を高速化する方法はありますか?
-
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
}
}
他のヒント
各データベースのシステム ビューを使用し、従来どおりにクエリを実行します。
TSQL クエリで取得できないものはほとんどありません。通常、この方法でメタデータを取得するのは非常に高速です。
所属していません StackOverflow