SQLモニタリング製品で作業していますが、SQLのすべてのデータベースのすべてのテーブルの詳細に関するデータを取得するデータベースクエリがあります。サーバ。各データベースでクエリを実行する方法C#とSQL Serverでパフォーマンスの差を計算する方法
これには2つのオプションがあります。 select name from [master].sys.sysdatabases
として、コードからのデータベース上
火クエリのすべてのデータベースのDB名が最初に、私は
"USE <fetched DB name>;"+"mainQuery";
を使用して、各DB 上の私のメインのクエリを起動します取得のためのfollowinコードをご確認ください同じ。
public DataTable GetResultsOfAllDB(string query) { SqlConnection con = new SqlConnection(_ConnectionString); string locleQuery = "select name from [master].sys.sysdatabases"; DataTable dtResult = new DataTable("Result"); SqlCommand cmdData = new SqlCommand(locleQuery, con); cmdData.CommandTimeout = 0; SqlDataAdapter adapter = new SqlDataAdapter(cmdData); DataTable dtDataBases = new DataTable("DataBase"); adapter.Fill(dtDataBases); foreach (DataRow drDB in dtDataBases.Rows) { if (dtResult.Rows.Count >= 15000) break; locleQuery = " Use [" + Convert.ToString(drDB[0]) + "]; " + query; cmdData = new SqlCommand(locleQuery, con); adapter = new SqlDataAdapter(cmdData); DataTable dtTemp = new DataTable(); adapter.Fill(dtTemp); dtResult.Merge(dtTemp); } return dtResult; }
IはTEMPTABLEから選択テーブルデータ型に格納するデータを格納されるSYSストア手順i.e.EXEC sp_MSforeachdbとフェッチされたデータを使用します。ドロップテーブルは魅力的です。
Declare @TableDetail table ( field1 varchar(500), field2 int, field3 varchar(500), field4 varchar(500), field5 decimal(18,2), field6 decimal(18,2) ) INSERT @TableDetail EXEC sp_MSforeachdb 'USE [?]; QYERY/COMMAND FOR ALL DATABASE' Select field1,field2 ,field3 ,field4 ,field5,field6 FROM @TableDetail
注同じ
ため 確認し、次のクエリ:データベースとテーブルの数の数が膨大であれば、これは仕上げを取得するすべてのデータベースまで、お待ちしておりますので、2番目のオプションのクエリでは、時間がかかります。私の質問は、上記の2つのオプションのどちらが良い選択肢ですか、なぜですか?または同じもののための他の任意の解決策。
ありがとうございます。
はどのようにして、各テストの間のシステムの違いやネットワーク遅延を決定しようとしているオブジェクト、これは最終的には何の関係もありません定義する要因となる可能性1つのDBパフォーマンス。 – Lloyd
私は心配です、それぞれのDBとフェッチデータまたは毎回1つの接続を開いて接続するたびに巨大なクエリを実行するのは大丈夫ですか? N/Wレイテンシに関してはこれは正しいですが、これはDBのパフォーマンスとは関係ありませんが、各DBまたはOlyのconnectopnの接続を再オープンする方が良いです – Darshan
ここで何をしたのですか? – bryanmac