为什么运行此查询时出现Timeout Expired错误?

时间:2009-05-02 22:32:09

标签: sql-server odbc

我正在使用ODBC在SQL Server 2008上运行此查询。如果我拿出最后一部分(或者li.DATEGENERATED> =(...)))那么我没有得到错误...但我可以在SSMS中运行它就好了。

SELECT COUNT(*) FROM dbo.POITEMST li
 WHERE (? IS NULL OR li.DATEGENERATED >= ?)
   AND (? IS NULL OR (li.DATEGENERATED >= (
    SELECT MAX(t.DATEGENERATED) FROM dbo.POITEMST t WHERE t.PONUM = ?)))

以下是我如何设置参数

DbParameter startDateParam = cmd.CreateParameter();
startDateParam.ParameterName = "StartDate";
startDateParam.Value = (StartDate.HasValue ? (object)StartDate.Value : (object)(new DateTime(1753, 2, 2)));
cmd.Parameters.Add(startDateParam);

startDateParam = cmd.CreateParameter();
startDateParam.ParameterName = "StartDate";
startDateParam.Value = (StartDate.HasValue ? (object)StartDate.Value : (object)(new DateTime(1753, 2, 2)));
cmd.Parameters.Add(startDateParam);

DbParameter startPoParam = cmd.CreateParameter();
startPoParam.ParameterName = "StartPO";
startPoParam.DbType = DbType.String;
startPoParam.Value = (string.IsNullOrEmpty(StartPurchaseOrder) ? (object)DBNull.Value : (object)StartPurchaseOrder);
cmd.Parameters.Add(startPoParam);

startPoParam = cmd.CreateParameter();
startPoParam.ParameterName = "StartPO";
startPoParam.DbType = DbType.String;
startPoParam.Value = (string.IsNullOrEmpty(StartPurchaseOrder) ? (object)DBNull.Value : (object)StartPurchaseOrder);
cmd.Parameters.Add(startPoParam);
编辑:那些日期只在那里,因为我试图弄明白......如果没有开始日期,它就会在DBNull中传递。

4 个答案:

答案 0 :(得分:1)

分而治之。从具有硬编码值的T-SQL开始,包括NULL和非null。从最简单的查询和构建开始,在每个步骤检查查询计划。你可能会发现你有索引问题等等。解决它然后回到代码。

如果没有更多的架构信息(表格布局,索引等),只需查询就很难提供帮助。

答案 1 :(得分:0)

在ssms中运行需要多长时间?如果您可以在启用执行计划的情况下运行查询(查询菜单,执行计划 - 而不是估计的执行计划。)如果存在索引问题,则应在执行计划窗格中通知您。

你或你的dba可以运行SQL分析器吗?并捕获实际传递到sql server的内容,以确认它符合您的预期。

答案 2 :(得分:0)

我认为您可以重构查询以提高性能:

SELECT COUNT(*) FROM dbo.POITEMST li
WHERE li.DATEGENERATED >= ISNULL(?,'1753-02-02')
AND li.DATEGENERATED >= ISNULL((SELECT MAX(t.DATEGENERATED) FROM dbo.POITEMST t WHERE t.PONUM = ?), '1753-02-02')

将与null的比较与OR相结合似乎是问题的一部分。

希望这有帮助,

比尔

答案 3 :(得分:0)

执行以下操作:

  1. 重构查询
  2. 将其变为存储过程
  3. 在相应的列上创建索引
  4. 根据我的经验,当遇到同一查询的SSMS和ODBC之间的性能差异时,索引会产生巨大的差异。

相关问题