1

我直接运行查询,本质上是微不足道的:

SELECT * FROM [dbo].[vwUnloadedJobDetailsWithData] WHERE JobId = 36963

当我从管理工作室运行它时,查询甚至不需要一秒钟。当我从表适配器中运行它时,它会超时。我已多次修复此问题,但修复很可笑。如果我从我的 xsd 文件中删除表适配器并重新创建它,查询时间与管理工作室的查询时间匹配大约两天,但我必须重新部署它是 asinine。

任何对可能导致这种情况的洞察力将不胜感激。我已经看到了另一个关于此的问题,但是在查询之前涉及 set arithabort on 的解决方案对我没有影响。

编辑:有人要求我显示调用查询的代码。现在,当我进入我的 xsd 文件并且也只是预览数据时,就会发生这种情况,但为了清楚起见,这里是:

using (TEAMSConnection connection = new TEAMSConnection())
{  
    connection.OpenConnection();

    _JobDetailsDAO jobDetailDao= new _JobDetailsDAO(connection);
    return jobDetailDao.GetUnloadedJobDetailsByJobId(jobId);

}

在处理连接时,数据库连接将关闭。使用这行代码:

if (_DBConnection != null && _DBConnection.State == ConnectionState.Open)
    _DBConnection.Close();    

Edit2:我运行了一个跟踪,这是正在设置的设置选项

设置quoted_identifier on set arithabort off set numeric_roundabort off set ansi_warnings on set ansi_padding on set ansi_nulls on set concat_null_yields_null on set cursor_close_on_commit off set implicit_transactions off set language us_english set dateformat mdy set datefirst 7 set transaction isolation level read commit

我去把它添加到我在管理工作室生成的查询中,它仍然在不到一秒钟的时间内运行。我什至完全复制了跟踪中的查询。

exec sp_executesql N'SELECT * FROM [dbo].[vwUnloadedJobDetailsWithData] WHERE JobID = @JobId',N'@JobId int',@JobId=36963

而且还不到一秒的返回时间。我很困惑。

谢谢,乔什

4

4 回答 4

0

只是想大声思考:也许是另一个进程/人造成的锁?有没有人同时更新同一行?是否有人从 Management Studio 或具有 Open Table 功能的 Query Analyzer 打开表并使用过滤器?尝试使用 sp_who2 查找锁

于 2009-07-26T15:33:38.463 回答
0

一些想法:

我称之为存储过程的参数嗅探。试试OPTION (RECOMPILE)提示,所以你发送的 SQL 看起来像这样:

exec sp_executesql
    N'SELECT *
         FROM [dbo].[vwUnloadedJobDetailsWithData]
         WHERE JobID = @JobId
         OPTION (RECOMPILE)',
    N'@JobId int',
    @JobId=36963

说明:当一个查询计划被生成和缓存时,它可能是一个不好的、非典型的值。假设 JobID 通常是非常有选择性的,但对于那个执行它不是。当您运行查询下一个计划时,缓存的计划对于下一个选择性 JobId 是错误的。由于各种原因,计划将被重新编译,但重新编译的价值很重要。

否则,Jobid 的确切数据类型是什么?如果它是 smallint,则该列将在参数化查询中转换为 int。使用常量时,它将是 smallint。确保类型定义正确:这在 SQL 代码中很重要。

于 2009-08-01T08:34:12.623 回答
0

发生这种情况的最可能的情况是 ssms 和 ado.net 之间的 SET 选项的差异。这种差异会导致(重新)构建可能不是最优的执行计划。

于 2009-07-22T14:43:12.823 回答
0

好吧,我找不到任何可以继续使用数据集的解决方案,所以我直接在代码中使用 SqlDataAdapter,而不是使用自动生成的 TableAdapter。

根据跟踪它执行完全相同的查询,但到目前为止它有效。它可能不会在两天内,但现在它似乎有效。

于 2009-07-22T20:46:10.270 回答