現在、SQL Serverを基盤とするデータベースを使用している.netコアで構築されたアプリケーションのパフォーマンスに関する問題をデバッグしています。 ORM。私はいくつかのワークロードをシミュレートするための小さなコンソールアプリケーションを書かれているパフォーマンスのデータベースパフォーマンスの違い:小規模な操作と大規模な操作の比較
:
SqlConnection sqlConnection1;
sqlConnection1 = new SqlConnection("Data Source=.\\SQLEXPRESS;Initial Catalog=Database;Integrated Security=True;MultipleActiveResultSets=true");
SqlCommand cmd = new SqlCommand();
SqlDataReader reader;
Console.WriteLine("==== Table1 (1000000) key-lookup ====");
var sw1 = new Stopwatch();
sw1.Start();
for (int i = 0; i < 1000000; i++)
{
cmd.CommandText = "SELECT Value FROM table1 WHERE Id='" + i + "'";
cmd.CommandType = CommandType.Text;
cmd.Connection = sqlConnection1;
sqlConnection1.Open();
reader = cmd.ExecuteReader();
var result = reader.Read();
if (result)
{
var test = reader.GetString(0);
}
sqlConnection1.Close();
}
sw1.Stop();
Console.WriteLine("Finished: " + sw1.Elapsed);
Console.WriteLine("==== Table2 (1000) full-text-scan ====");
var sw2 = new Stopwatch();
sw2.Start();
for (int i = 0; i < 1000; i++)
{
cmd.CommandText = "SELECT Name FROM table2 WHERE Name LIKE '%" + i + "%'";
cmd.CommandType = CommandType.Text;
cmd.Connection = sqlConnection1;
sqlConnection1.Open();
reader = cmd.ExecuteReader();
var result = reader.Read();
if (result)
{
var test = reader.GetString(0);
}
sqlConnection1.Close();
}
sw2.Stop();
Console.WriteLine("Finished: " + sw2.Elapsed);
Console.ReadKey();
Entity Frameworkのをシミュレートするために私が開かれ、各クエリの接続を閉じました。
私は、このアプリケーションを実行すると、私は次のような結果を得る、server1上のインストール、およびデータベースは、データベース・サーバー上に配置されているでアプリケーション:
私のマシン(同じシステム上のアプリ+ SQL Serverの):
を- キーシーク:1m53s
- 全文:4m31s
のServer1(アプリ、ネットワークを介したデシベル):
- キーシーク:30m49s(!!!!)
- 全文:9m19s
データベースサーバー:
- キーシーク:7分7秒
- 全文:8m45s
違いはネットワーク関連のようですが、サーバーはすべてVMが同じハードウェア上に座っているだけです。誰かがアイデアを持っていますが、このパフォーマンスの低下をアプリサーバーに引き起こす原因は何ですか?
EFをシミュレートする場合は、パラメータ化されたクエリを使用することをお勧めします。それは少しパフォーマンスを改善するかもしれませんが、ラウンドトリップの数はテントの長いポールになります。 FWIWでは、一般的なハードウェア上でシングルスレッドのアプリケーションを使用して1Gbのネットワーク上で1秒あたり2Kを超える些細なクエリを達成できるはずです。それはあなたがdbサーバ上でローカルに見ているもので、VMはそれができるものではありません。 –
あなたは、ネットワークトラフィックに時間がかかることを実証しました。それは新しいことではない。残りの部分は、名前付きパイププロトコルとTCP/IPの関係にあると考えられます。 –