我有一个查询,我正在从.NET应用程序执行到SQL Server数据库,它似乎需要很长时间才能完成(5分钟以上)。我在c#中创建了一个测试应用程序,试图查看说话的内容如此之长(查询应该快速返回)。

当我通过添加元素来重构查询以查看哪个部分花了这么长时间时,我最终逐字地重构查询,其中唯一的区别是原始查询中的空格和大小写差异。这种差异在大约100毫秒内返回结果。

以前有人见过这个吗?我想知道我们的服务器(因为同事有同样的问题)或我们的计算机上是否关闭了服务。

提前感谢您提供任何帮助。

下面的代码示例(最后查询第一行的差异(fk_source与fk _Source):

//Original
    OleDbCommand comm = new OleDbCommand("select min(ctc.serial_no) as MIN_INTERVAL from countstypecode ctc, source s, countstype ct, counts c where ct.value_id=c.value_id and s.c_id=ct.fk_source and " +
      "ct.timeinterval=ctc.typename and ct.timeinterval in ('15min','1h','1day') and c.time_stamp >=  CONVERT(datetime,'01-01-2008',105)  and c.time_stamp < " +
      "CONVERT(datetime,'01-01-2009',105)  and s.c_id = '27038dbb19ed93db011a315297df3b7a'", dbConn);

//Rebuilt
    OleDbCommand comm = new OleDbCommand("select min(ctc.serial_no) as MIN_INTERVAL from countstypecode ctc, source s, countstype ct, counts c where ct.value_id=c.value_id and s.c_id=ct.fk_Source and " +
      "ct.timeinterval=ctc.typename and ct.timeinterval in ('15min','1h','1day') and c.time_stamp >= CONVERT(datetime,'01-01-2008',105) and c.time_stamp < " +
      "CONVERT(datetime,'01-01-2009',105) and s.c_id='27038dbb19ed93db011a315297df3b7a'", dbConn);
有帮助吗?

解决方案

我怀疑这是一个过程缓存问题。存储过程的一个好处是可以为您存储计划,从而加快速度。不幸的是,有可能在缓存中得到一个糟糕的计划(即使使用动态查询)。

为了好玩,我检查了我的程序缓存,运行了一个adhoc查询,再次检查,然后我运行了不同的capitlization相同的查询,我很惊讶地看到程序计数更高。

试试这个......

连接到SQL Server Management Studio。

DBCC MemoryStatus

Select Columns... From TABLES.... Where....

dbcc MemoryStatus

Select Columns... From tables.... Where....

dbcc MemoryStatus

我认为当语句发生变化时,你会发现TotalProcs会发生变化(即使唯一的变化区分大小写)。

更新统计信息可能会有所帮助。这是一个相当慢的运行过程,因此您可能希望在缓慢的时间内运行它。

其他提示

由于您使用的是SQL Server 2005,您是否尝试使用SqlCommand对象而不是OleDbCommand对象?

我没有看到您的查询会影响性能的差异 - 运行之间的缓存或索引/统计信息更改怎么样?由于统计数据或索引更改,执行计划可能已更改。

关于这种情况:如果数据库设置为区分大小写,则情况可能很重要,但是对于在区分大小写的数据库中运行的两个查询,必须存在以两种格式命名的列 - 查询解析器将遵循案例 - 它不会导致性能差异。

首先,您是否100%确定其查询出错了?检查sql server中的跟踪配置文件,看看它在数据库中的占用时间。

其次,你得到相同数量的结果吗?在sql server中默认大小写无关紧要,但它可能设置不同。

如果我的查询花了“5分钟以上”,我就不会担心匹配字符串大小写所需的100毫秒。

感谢您的所有答案,我将依次回复每个答案:

1)Russ,我同意SQLConnection会更好,但不幸的是我没有设置连接类型。我刚刚创建了一个小应用程序来测试这个查询,但是查询是在一个更大的应用程序中动态创建的。

2)gbjbaanb,我认为这不是服务器问题,因为我几乎可以在同一时间从管理工作室运行两个查询,在.net(1.1和2.0)中运行oledb时似乎只是一个问题。我们在其上运行了一个分析器,跟踪文件确认以这种方式调用完成查询需要5分钟。

<3> Joel Coehoorn,同意,但我真正想要的是“为什么”因为现在我们不知道这个问题有多大以及它在哪里。

4)Cade Roux,差异是非常可重现的,因此我认为这不是索引更改或缓存的问题,因为我已经以相同的结果背靠背运行测试,并且它们大约需要相同的时间要运行的SQL Server。

感谢G Mastros提供最完整的答案,尽管回想起Cade建议的统计更新。然而,G Mastos的解决方案更适合我的SQL Server体验。

感谢帮助大家!

我将研究为什么这种看似无辜的差异会产生如此大的后果

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top