【发布时间】:2017-02-05 11:28:41
【问题描述】:
我目前正在调试使用 SQL Server 作为底层数据库和 Entity Framework Core 作为 ORM 在 .net 核心中构建的应用程序的一些性能问题。
我编写了一个小型控制台应用程序来模拟一些工作负载:
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();
为了模拟实体框架,我为每个查询打开和关闭了连接。
应用程序安装在 server1 上,数据库位于数据库服务器上,当我运行此应用程序时,我得到以下结果:
我的机器(同一系统上的app + SQL Server):
- key-seek:1m53s
- 全文:4 分 31 秒
Server1 (app, db via network):
- 键位:30 分 49 秒 (!!!!)
- 全文:9 分 19 秒
数据库服务器:
- 键搜索:7m07s
- 全文:8 分 45 秒
差异似乎与网络有关,但服务器都只是位于同一硬件上的虚拟机。有谁知道,是什么导致应用服务器性能不佳?
【问题讨论】:
-
如果您尝试模拟 EF,我建议使用参数化查询。这可能会稍微提高性能,但往返次数将是帐篷中的长杆。 FWIW,您应该能够在通用硬件上使用单线程应用程序在 1gb 网络上实现每秒超过 2K 的琐碎查询。这就是您在数据库服务器上本地看到的内容,因此虚拟机不是它可能的样子。
-
所以你证明了网络流量需要时间。这并不新鲜。其余的可能归因于命名管道协议与 TCP/IP。
标签: sql-server performance entity-framework performance-testing database-performance