【问题标题】:sql server, return resultset before sql timeoutsql server,在sql超时之前返回结果集
【发布时间】:2013-11-20 21:32:20
【问题描述】:

由于表的大小(超过 1000 万条记录),我有一个查询超时。

创建新索引不是一种选择。该查询在 sql server 上运行,并由 .net 网站调用。

有什么方法可以在超时发生之前从结果中返回。

select count(XYZ.A) from XYZ where XYZ.B = 'abc';

测量经过的时间并在查询超时之前返回结果。

谢谢

【问题讨论】:

  • 您使用的是什么 DBMS?向我们展示您的表结构?
  • 你在那个表上有索引吗?如果您在一个小的、不可为空的列(如INTBIGINT)上有一个索引,那么COUNT(*) 将使用该列,并且很可能它必须读取更少的数据页 确定计数
  • 如果我们知道您想对所有这些记录做什么,我们可以更好地帮助您找到解决方案。例如,如果结果实际上没有那么多行,那么您正在执行表扫描,并且简单的索引更改可能会使该查询立即返回。如果您确实有很多行,也许更改结果的顺序(即:完全忽略 order by),或者找到更好的方法来过滤它们会有所帮助。
  • 您从哪里调用查询? SSMS? .NET 应用程序?别处?也可以试试select count(1) 而不是select count(*)
  • SELECT TOP 1000 * FROM XYZ 需要多长时间? SELECT TOP 100000 * 怎么样?那些也超时吗?

标签: sql sql-server timeout


【解决方案1】:

尝试为您的表添加索引。

然后通过转到查询 > 显示估计的执行计划来检查您的执行计划。向下滚动计划以寻找最大的查询成本。单击绿色文本。它可能会说“缺少索引”。右键单击并选择缺少索引详细信息。它将生成通用代码来创建您的索引。编辑模板并运行它。

希望这会有所帮助。

【讨论】:

  • 不能添加索引。
  • 不能在查询仍在运行时返回数据。 SQL 不估计查询时间。它可以估计查询成本,但这与运行时间无关。您必须找到解决方法,例如在卡盘中运行查询(获取 2012 年的所有记录,然后是 '11,然后是 '10 等)。在我的连接字符串中,我不得不增加 SSRS 连接的默认超时时间30 秒到 600。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 1970-01-01
  • 1970-01-01
  • 2023-02-06
相关资源
最近更新 更多