我有一个转换实用程序,基本上从一个表复制值到另一个。它工作了一段时间,但我遇到了一个客户的奇怪问题。他们用公用程序获得了150万条记录,但现在它完全停止了。SqlCommand调用SQL Server存储过程超时
从VB.Net调用存储过程时,它只是挂起,直到SqlCommand超时。从Management Studio调用相同的存储过程即刻执行。对于SqlCommand的我VB.Net代码如下(insertConn
定义和之前打开,dr
是已在前面的步骤填充了从完全不同的SqlConnection和SqlCommand的情况下,一个SqlDataReader):
Dim conn As New SqlConnection("connection string here")
Dim insertConn As New SqlConnection("connection string here")
Dim dr As SqlDataReader = Nothing
Dim readCommand As New SqlCommand("my query here", conn)
conn.Open()
insertConn.Open()
...
dr = readCommand.ExecuteReader()
...
While dr.Read()
Using insertCommand = New SqlCommand("dmDocumentFieldInsert", insertConn)
insertCommand.CommandType = CommandType.StoredProcedure
insertCommand.Parameters.AddWithValue("@DocumentKey", dr("DocumentKey"))
insertCommand.Parameters.AddWithValue("@FieldId", "TITLE")
insertCommand.Parameters.AddWithValue("@FieldValue", dr("DocumentTitle"))
insertCommand.ExecuteNonQuery()
End Using
End While
我试着重新启动SQL Server以清除所有锁,重新编译sproc,增加SqlCommand和SqlConnection超时全部无济于事。
我检查了要添加到参数中的数据,它是有效的数据...如果我手动调用具有相同数据的sproc,它可以正常工作。
我原本没有使用Using
块,但改变了这个看看是否有一些资源问题没有被处置/关闭。该实用程序的内存使用量仅在5MB左右,所以看起来没有任何内存问题。
有没有人对下一步尝试解决方案有什么建议?根据注释
编辑新增循环和初始化代码请求
编辑我最新统计资料和重建表索引,没有任何变化。
编辑表中有三个索引将数据复制到(dmDocumentField)。如果我禁用了所有三个索引,那么该sproc就会完美执行,尽管比索引存在时慢得多。如果我启用它们中的任何一个,那么该实用程序最多可以通过几百条记录,然后在sproc上同时超时。删除并重新创建索引不起作用。表的结构和指标如下:
CREATE TABLE [dbo].[dmDocumentField](
[FieldKey] [bigint] IDENTITY(1,1) NOT NULL,
[DocumentKey] [char](36) NOT NULL,
[FieldId] [varchar](10) NOT NULL,
[FieldValue] [varchar](255) NOT NULL,
CONSTRAINT [PK_dmDocumentField] PRIMARY KEY NONCLUSTERED
(
[FieldKey] ASC,
[DocumentKey] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
索引(除了PK):
CREATE NONCLUSTERED INDEX [dmDocumentField_DocumentKey] ON [dbo].[dmDocumentField]
(
[DocumentKey] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
。
CREATE NONCLUSTERED INDEX [dmDocumentField_DocumentKey_IFieldId_IFieldValue] ON [dbo].[dmDocumentField]
(
[DocumentKey] ASC
)
INCLUDE ( [FieldId],
[FieldValue]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
我还应该提到,该实用程序是在VB.Net 4中,所讨论的SQL Server是SQL Server 2008 R2 Standard。 – Kettch19
SQL探查器中的任何异常? –
您可以尝试使用[Enterprise Library](http://msdn.microsoft.com/zh-cn/library/ff648951.aspx)中的数据访问方法。 –