0

私はこの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 > 12/02/2015)私の日付が両方のクエリで 12/02/2015 未満の場合。または、2015 年 5 月 5 日を超えると、クエリの応答に 200 ミリ秒から 2 秒かかりますが、これは問題ありません。

ただし、日付が例のようである場合、回答に 1 分以上かかります。

何が原因なのか個人的にはわかりません。

4

1 に答える 1

0

一般に、経験則として、このような違いは、SQL Server が一連の基準ごとに異なる実行プランを選択していることを意味します。そして(経験則として)これは、最初から適切なインデックスがない(またはインデックスがまったくない)ことを意味します。実行計画の調査から始めて、テーブル スキャンを探します。それらは悪いです。そして、最も明白な選択: column のインデックスがないようですfetcha。それを作成すると、違いがわかります。

.

于 2015-05-13T09:44:05.960 に答える