我正在使用Advantage Database Server v10以及相应的 ADO.NET 提供程序。我发现执行 INSERT/UPDATE
查询后,AdsConnection.Close
需要花费大量时间。
例如这个示例
class Program
{
static void Main(string[] args)
{
var openTimer = new Stopwatch();
var closeTimer = new Stopwatch();
var executeTimer = new Stopwatch();
for (int ix = 0; ix < 100; ix++)
{
openTimer.Start();
using (var cnn = new AdsConnection(
@"data source=...; ServerType=remote; user id=admin; password=..."))
{
cnn.Open();
openTimer.Stop();
executeTimer.Start();
using (var cmd = cnn.CreateCommand())
{
cmd.CommandText = "SELECT MAX(colUGId) FROM tblUserGroup";
var id = (int)cmd.ExecuteScalar() + 1;
cmd.CommandText = "INSERT INTO tblUserGroup (colUGId, colName, colDesc) VALUES (:id, :name, :desc)";
cmd.Parameters.Add("id", id);
cmd.Parameters.Add("name", "Name " + id);
cmd.Parameters.Add("desc", "Description " + id);
cmd.ExecuteNonQuery();
}
executeTimer.Stop();
closeTimer.Start();
}
closeTimer.Stop();
}
Console.WriteLine("Open: {0}; Execute: {1}; Close: {2}", openTimer.Elapsed, executeTimer.Elapsed, closeTimer.Elapsed);
}
}
输出:
Open: 00:00:00.2361612; Execute: 00:00:15.3849932; Close: 00:00:05.4333431
非常有趣的是,为什么在具有简单索引且没有任何触发器的简单表中执行 100 个 INSERT 操作需要 15 秒。但最重要的问题是:为什么 Close
需要这么长时间?
有什么想法吗?
更新
刚刚在 SQL Server 上尝试了同样的操作。它在不同的工作站上运行,这比具有 Advantage 的工作站要快一些。不管怎样,我可以看到连接池工作得很好(对于 SQL Server):
Open: 00:00:00.2279668; Execute: 00:00:00.0189551; Close: 00:00:00.0003487
最佳答案
15秒确实很长。既然您提到了索引,我确信您有必要的索引,但请确保 colUGId
上有索引。如果该索引不存在,则 select max
查询每次运行时都需要进行全表扫描。如果表相对较大,则成本可能会很高。
虽然连接池确实消除了每次通过循环获取新连接的成本,但所示的代码导致每次迭代时所涉及的表完全关闭。因此,服务器最终会通过循环每次打开和关闭表(假设在执行此测试时没有其他用户打开它)。这肯定会增加成本,尽管我不知道为什么会导致报告的时间。
虽然它没有回答问题,但我运行了上面的确切代码(当然修改了连接字符串)并生成了这些数字:
Open: 00:00:00.8909295; Execute: 00:00:01.4729069; Close: 00:00:01.4211188
出于好奇,我将连接的获取移到循环之外并再次运行它。这允许表在执行之间保持打开状态。结果如下:
Open: 00:00:00.1073400; Execute: 00:00:00.0802774; Close: 00:00:00.0270569
编写的代码需要注意的另一件事是它不能重用任何准备好的语句。特别是,相同的命令对象用于 SELECT 和 INSERT。这会导致每次迭代都会对语句进行解析和语义检查。这当然不是什么大事,但它可以累积起来。我使用两个命令对象再次运行测试并得到这些数字:
Open: 00:00:00.0835544; Execute: 00:00:00.0567687; Close: 00:00:00.0267799
关于.net - Advantage 数据库服务器 INSERT/UPDATE 查询性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16945578/