Nic*_*aro -2 performance sql-server sql-server-2008-r2 query-performance
我现在在 SQL Server 2008 R2 中看到了一些行为,我无法确定服务器是否表现不佳。
我已经设置了一个测试,将一个整数插入到一个表中,如下定义,75,000 次。
dbo.Test1
(
id INT IDENTITY(1,1)
, [text] VARCHAR(2000)
, [timestamp] DATETIME NOT NULL DEFAULT(GETDATE())
)
Run Code Online (Sandbox Code Playgroud)
插入数据的应用程序(下面的 C# 代码)和 SQL Server 实例都在同一个物理盒子上。
结果:该过程需要将近 10 分钟的时间来循环和插入数据。不太确定这怎么可能。
for (int i = 0; i < 75000; i++)
{
using (SqlConnection connection = new SqlConnection(@"<server>"))
{
connection.Open();
using (SqlCommand command = new SqlCommand("INSERT INTO dbo.Test1 ([text]) SELECT '" + i + "'", connection))
{
command.ExecuteNonQuery();
}
connection.Close();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
根据@AaronBertrand 的回复更新问题。
我有多大?正如我所指定的,它是一个循环中的整数。我不关心可能会或可能不会出现在文本列中的文本。
什么样的驱动?这是一个 7200 SATA ( http://www.seagate.com/ww/v/index.jsp?vgnextoid=2ee06c02c732f110VgnVCM100000f5ee0a0aRCRD )
数据库很小吗?是的,这是一个可能的问题。
数据库是远程的吗?请更仔细地阅读问题。一切都在同一个物理盒子上,就在我面前。虽然网络上的两个盒子存在同样的问题,但我现在不想调试网络问题。只是 SQL Server 插入问题。
现在在自动增长问题上有很多钱。
编辑2:
再次更新。
机器是虚拟机吗?不。
应用程序连接方法正在研究。由于所有东西都在同一个盒子上,我不确定它是如何连接的。
触发器无
资源调控器未设置。
探查器探查器没有显示任何延迟,这让我很烦。
阻塞这是唯一发生的事情,所以不应该有任何阻塞或等待,也许不包括日志等待。在我的盒子上,所有东西都在同一个物理磁盘上。但是,(但是)在其他具有相同问题的盒子上,情况并非如此,因此我目前不会将此视为问题。
我的预感是它与您的循环打开和关闭连接 75,000 次有关。也许尝试这样的事情,看看会发生什么:
using (SqlConnection connection = new SqlConnection(@"<server>"))
{
connection.Open();
using (SqlCommand command = new SqlCommand("INSERT INTO dbo.Test1 ([text]) VALUES (@i)", connection))
{
command.Parameters.Add(new SqlParameter("@i", SqlDbType.Int));
for (int i = 0; i < 75000; i++) {
command.Parameters["@i"].Value = i;
command.ExecuteNonQuery();
}
}
connection.Close();
}
Run Code Online (Sandbox Code Playgroud)
编辑:我发现的另一个加速是将所有执行包装在一个事务中(大概这消除了不断锁定和释放锁的开销)。不要SqlTransaction trans = connection.BeginTransaction()实例化你的SqlCommand之前和trans.Commit()之后的工作。以下是我的开发机器上的运行时间:
1:08.14 - 原始版本
0:33.05 - 更改为只打开一次连接,并重用 SqlConnection
0:11.93 - 更改为使用单个事务