查询性能与 where 子句中的日期更改不同
Query performance differs with just date change in where clause
我有这个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
格式,table movimientos 有大约 450000 行。
如果我在两个 WHERE (fecha > 12/02/2015)
查询中的日期都小于 12/02/2015。或者在 05/05/2015 之后,查询需要 200 毫秒到 2 秒才能回答,这没问题。
但是,如果日期与示例中的日期相同,则需要一分钟的时间才能回答。
我个人不知道是什么原因。
一般来说,根据经验,这种差异意味着 SQL 服务器正在为每组标准选择不同的执行计划。并且(再次作为经验法则)这意味着它没有一个好的索引开始(或者根本没有索引)。
从检查执行计划开始,查找 table 扫描。那些不好。
最明显的选择是:fetcha
列似乎没有索引。创建它,您会看到不同之处。
.
我有这个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
格式,table movimientos 有大约 450000 行。
如果我在两个 WHERE (fecha > 12/02/2015)
查询中的日期都小于 12/02/2015。或者在 05/05/2015 之后,查询需要 200 毫秒到 2 秒才能回答,这没问题。
但是,如果日期与示例中的日期相同,则需要一分钟的时间才能回答。
我个人不知道是什么原因。
一般来说,根据经验,这种差异意味着 SQL 服务器正在为每组标准选择不同的执行计划。并且(再次作为经验法则)这意味着它没有一个好的索引开始(或者根本没有索引)。
从检查执行计划开始,查找 table 扫描。那些不好。
最明显的选择是:fetcha
列似乎没有索引。创建它,您会看到不同之处。
.