【问题标题】:Query performance differs with just date change in where clause查询性能仅因 where 子句中的日期更改而异
【发布时间】:2026-02-12 18:20:04
【问题描述】:

我有这个 SQL

SELECT 
    ABS(a.cantidad - ISNULL(b.cantidad, 0)) as cantidad, 
    a.codarticulo, a.codalmacen, a.codarticulotallaje 
FROM 
    (SELECT 
         ABS(ISNULL(SUM(cantidad), 0)) AS cantidad, 
         movimientos.codarticulo, codalmacen, 
         movimientos.codarticulotallaje 
     FROM movimientos 
     WHERE 
         (fecha > '12/02/2015') AND (fecha < '12/05/2015 10:29:30') 
         AND (altabaja = 2) AND 
         ((tipodocumento = 3) OR (tipodocumento = 4)) AND (codalmacen = '3') 
     GROUP BY 
         movimientos.codarticulo, movimientos.codalmacen, 
         movimientos.codarticulotallaje) as a 
LEFT OUTER JOIN 
   (SELECT 
        ABS(ISNULL(SUM(cantidad),0)) as cantidad, 
        movimientos.codarticulo, codalmacen, codarticulotallaje 
    FROM movimientos 
    WHERE (fecha > '12/02/2015') AND (fecha < '12/05/2015 10:29:30') 
      AND (codalmacen = '3') AND (altabaja = 1) 
      AND ((tipodocumento = 5) OR (tipodocumento = 6)) 
      AND (cantidad > 0) 
   GROUP BY 
       movimientos.codarticulo, 
       codalmacen, codarticulotallaje ) as b 
       on a.codarticulo = b.codarticulo AND 
          a.codarticulotallaje = b.codarticulotallaje 

日期时间是dd/MM/yyyy 格式化表格movimientos 有大约450000 行。

如果我在两个 WHERE (fecha &gt; 12/02/2015) 查询中的日期都小于 12/02/2015。或者在 2015 年 5 月 5 日之后,查询需要 200 毫秒到 2 秒才能回答,这没关系。

但是,如果日期与示例中的日期相同,则需要一分钟才能回答。

我个人不知道是什么原因。

【问题讨论】:

  • 服务器显然决定了不同的执行计划。比较两者。列“fecha”是否已编入索引?我猜不是,您必须为此列创建索引。
  • 是的,这就是原因。
  • @Zitu 您的问题已通过 Marko 评论解决,如果是,请告诉我
  • 是的,就是这样解决的。

标签: sql-server where-clause response-time


【解决方案1】:

一般来说,根据经验,这种差异意味着 SQL Server 为每组条件选择不同的执行计划。而且(再次作为经验法则)这意味着它没有一个好的索引开始(或者根本没有索引)。 从检查执行计划开始,寻找表扫描。那些很糟糕。 最明显的选择是:fetcha 列似乎没有索引。创建它,你会看到不同。

.

【讨论】: