【问题标题】:Select TOP not completing the query?选择 TOP 未完成查询?
【发布时间】:2014-03-22 11:07:32
【问题描述】:

我的表中有 440 行与我的以下查询匹配

  SELECT RecordID 
  FROM  
      [tblRules]
  WHERE 
       DATEDIFF(MONTH,CreationDate,GETDATE()) >=  6 
   AND YEAR(CreationDate) = 2013 
  ORDER BY  RecordID , BR_ID

当我执行这个查询时,我会在 4 秒内得到 440 行

当我像下面那样做顶部时,

  SELECT TOP 440 RecordID 
  FROM  
      [tblRules]
  WHERE 
       DATEDIFF(MONTH,CreationDate,GETDATE()) >=  6 
   AND YEAR(CreationDate) = 2013 
  ORDER BY  RecordID , BR_ID

它在 7 秒内返回 440 行

但是当我设置高顶数时它会永远运行而不返回结果我给它一个完整的运行时它运行直到服务器的内存缓冲区满了5个小时我运行的查询是

  SELECT TOP 500 RecordID 
  FROM  
      [tblRules]
  WHERE 
       DATEDIFF(MONTH,CreationDate,GETDATE()) >=  6 
   AND YEAR(CreationDate) = 2013 
  ORDER BY  RecordID , BR_ID

即使我将500 替换为440 以外的任何内容,它也会运行并且永远不会返回结果。我在很多事情上苦苦挣扎,谁能给我任何解决方案或为什么会发生这种情况。该数据库中的所有其他表都工作正常。表 tblRules 中有超过 10 亿条记录。

【问题讨论】:

  • 在 CreationDate 上放置一个索引 - 看看是否有变化。
  • 我认为这是一个硬件问题,SQL 可以在不到一秒的时间内查询到,即使没有 440 条记录的索引,除非你有数百万/数十亿。
  • @PreetSangha 已经被索引了,当top 的记录数在它的范围内时它可以正常工作,但当它超出范围时就不行
  • @Jade 是的,如果是硬件问题,我的记录在该表中超过了数十亿,它应该在其他查询中也给出这一点
  • @PreetSangha 感谢队友的建议,但Satheesh 解决方案正在发挥作用,问题是条件使我的索引和优化器无法运行的功能,因此它需要永远运行。感谢您的帮助

标签: sql sql-server performance tsql sql-server-2008-r2


【解决方案1】:

我的第一个观察是 where 子句中使用的函数。这将阻止优化器使用 CreationDate 上的任何可用索引。

为了使优化器能够有效地使用索引,查询应该是 SARGable

What makes a SQL statement sargable?

declare @yeartoget varchar(4)='2013'
SELECT TOP 440 RecordID 
FROM                         
    [tblRules]
WHERE 
    CreationDate >=  DATEADD(MONTH,-6 ,getdate())
    AND CreationDate 
 between convert(datetime,convert(varchar(4),@yeartoget)+'0101') and          
         convert(datetime,convert(varchar(4),@yeartoget)+'1231')
 ORDER BY  RecordID , BR_ID

这个版本有什么不同吗?

【讨论】:

  • 我会试一试告诉你
  • 嘿,谢谢伙计,我什至不知道这个世界SARGable,感谢这个词,这是我今天的话。是的,您的查询有效,谢谢
猜你喜欢
  • 2018-05-27
  • 2019-04-25
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 1970-01-01
相关资源
最近更新 更多