在SQL Server中将文件上载到varbinary(max) - 在一台服务器上运行,而不是在另一台服务器上运行

时间:2010-06-16 15:39:47

标签: c# asp.net sql-server

我有一些代码允许用户通过Web浏览器将文件附件上传到SQL Server的varbinary(max)列。它已经工作了近两年,但突然间它停止了工作。它只停止在生产数据库服务器上工作 - 它仍然可以在开发服务器上正常工作。

我只能得出结论,代码很好,并且SQL Server本身的实例也存在一些问题。但我不知道如何隔离问题。

我在ATTACHMENT表中插入一条记录,只插入标题和内容类型等非二进制数据,然后使用以下代码对上传的文件进行chunk-upload:

// get the file stream

 System.IO.Stream fileStream = postedFile.InputStream;

// make an upload buffer

byte[] fileBuffer;
fileBuffer = new byte[1024];

// make an update command

SqlCommand fileUpdateCommand = new SqlCommand("update ATTACHMENT set ATTACHMENT_DATA.WRITE(@Data, NULL, NULL) where ATTACHMENT_ID = @ATTACHMENT_ID", sqlConnection, sqlTransaction);

fileUpdateCommand.Parameters.Add("@Data", SqlDbType.Binary);
fileUpdateCommand.Parameters.AddWithValue("@ATTACHMENT_ID", newId);

while (fileStream.Read(fileBuffer, 0, fileBuffer.Length) > 0)
{

     fileUpdateCommand.Parameters["@Data"].Value = fileBuffer;
     fileUpdateCommand.ExecuteNonQuery(); <------ FAILS HERE

}

fileUpdateCommand.Dispose();
fileStream.Close();

如果它显示“FAILS HERE”,它会暂停一段时间,然后在循环的第一次迭代中出现SQL Server超时错误。如果我改为连接到开发数据库,​​一切正常(它遍历循环很多次,并且提交成功)。

两台服务器完全相同(SQL Server 9.0.3042),模式也相同。

当我在超时后立即打开活动监视器以查看它是什么时,它说最后一个命令是

(@Data binary(1024),@ATTACHMENT_ID decimal(4,0))update ATTACHMENT set ATTACHMENT_DATA.WRITE(@Data, NULL, NULL) where ATTACHMENT_ID = @ATTACHMENT_ID

我期望但它也说它的状态为“Suspended”,等待类型为“PAGEIOLATCH_SH”。我看了这个,这似乎是一件坏事,但我找不到任何特定的东西。

想法?

好的,这是sys.dm_exec_requests的输出:

session_id request_id  start_time              status                         command          sql_handle                                                                                                                         statement_start_offset statement_end_offset plan_handle                                                                                                                        database_id user_id     connection_id                        blocking_session_id wait_type                                                    wait_time   last_wait_type                                               wait_resource                                                                                                                                                                                                                                                    open_transaction_count open_resultset_count transaction_id       context_info                                                                                                                                                                                                                                                       percent_complete estimated_completion_time cpu_time    total_elapsed_time scheduler_id task_address       reads                writes               logical_reads        text_size   language                                                                                                                         date_format date_first quoted_identifier arithabort ansi_null_dflt_on ansi_defaults ansi_warnings ansi_padding ansi_nulls concat_null_yields_null transaction_isolation_level lock_timeout deadlock_priority row_count            prev_error  nest_level  granted_query_memory executing_managed_code
---------- ----------- ----------------------- ------------------------------ ---------------- ---------------------------------------------------------------------------------------------------------------------------------- ---------------------- -------------------- ---------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ------------------------------------ ------------------- ------------------------------------------------------------ ----------- ------------------------------------------------------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------- -------------------- -------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ---------------- ------------------------- ----------- ------------------ ------------ ------------------ -------------------- -------------------- -------------------- ----------- -------------------------------------------------------------------------------------------------------------------------------- ----------- ---------- ----------------- ---------- ----------------- ------------- ------------- ------------ ---------- ----------------------- --------------------------- ------------ ----------------- -------------------- ----------- ----------- -------------------- ----------------------
59         0           2010-06-16 10:49:26.130 suspended                      UPDATE           0x020000003499A22E28282311CAF8CE0730402C45DCD89961                                                                                 0                      0                    0x06000E003499A22EB881FD73000000000000000000000000                                                                                 14          5           4AB28A88-B4B9-4B54-B4F4-311D42C5EA29 0                   PAGEIOLATCH_SH                                               0           PAGEIOLATCH_SH                                               14:1:547920                                                                                                                                                                                                                                                      1                      1                    226115095            0x                                                                                                                                                                                                                                                                 0                0                         187         3687               0            0x0088B3D8         921                  0                    240166               2147483647  us_english                                                                                                                       mdy         7          1                 1          1                 0             1             1            1          1                       2                           -1           0                 1                    0           3           490                  0

(1 row(s) affected)

修改

好的,我重新启动,没有骰子(无论如何都需要安装一些补丁)。在ATTACHMENT_ID上删除并重建了PK,没有骰子。然后我重建了桌子的统计数据,现在看起来很开心。我只能猜测统计数据中存在一些导致查询优化器失灵的东西。

1 个答案:

答案 0 :(得分:1)

从症状看,由于必须执行表扫描,查询超时。表ATTACHMENT在两台服务器上都有ATTACHMENT_ID的索引吗?你能仔细检查吗?如果模式相同但两者都缺少索引,那么这些表的大小是否相当?可能是测试机上的扫描持续时间不到30秒,而生产中的扫描持续时间足够超时。在这种情况下,您需要并索引ATTACHMENT_ID。