sql >> Databáze >  >> RDS >> Sqlserver

Jak zlepšit výkon nedeterministické funkce sloupce v klauzuli where nebo spojení?

Kromě nedeterministické funkce vidím problém v tom, že provádíte výpočty na poli. To (obvykle) způsobí, že jakýkoli index v poli nebude pro dotaz použitelný.

Druhý odstavec tohoto odkazu (Deset běžných chyb programování SQL (funkce v indexovaných sloupcích v predikátech) ) poskytuje podrobnější informace o tom, kdy se to stane, jak se tomu vyhnout a jak někdy mohou optimalizátory používat indexy navzdory použití funkcí.

Stručně řečeno, namísto spoléhání se na vylepšené optimalizátory je často možné změnit dotaz tak, že pole ponecháte nedotčené (aniž byste s ním prováděli žádné výpočty), ale místo toho prováděli (obrácené) výpočty s ostatními hodnotami. Ve vašem případě k aktuálnímu datu, které poskytuje GetDate() . Pak může dotaz použít index pole table1.Date .

Takže můžete použít něco jako:

SELECT COUNT(*) 
FROM table1
WHERE table1.Date
      BETWEEN
             /* First Day of Current Month */
          AND 
             /* Last Day of Current Month */

A stačí najít funkce, které vám poskytnou první a poslední den aktuálního měsíce.

Tento příspěvek na blogu vám může pomoci:sql-server-query-k-najít-první-a-poslední-den-aktuálního-měsíce/

Ještě lepší je tato otázka/odpověď StackOverflow:nejjednodušší způsob, jak-vytvořit-datum-které-je-první-den-v-měsíci-dán -další-datum

Budu muset otestovat, ale myslím, že tato malá variace výše uvedeného bude stačit:

SELECT COUNT(*) 
FROM table1
WHERE table1.Date 
      >=      /* First Day of Current Month */
        DATEADD(mm, DATEDIFF(mm, 0, GetDate() ), 0) 
  AND table1.Date 
      <       /* First Day of Next Month */
        DATEADD(mm, 1 + DATEDIFF(mm, 0, GetDate() ), 0) 


  1. Magento Mass Import obrázků s MAGMI - obrázky vyloučeny

  2. Jak vzít vstupy dynamicky vytvořeného textového pole na php a uložit je do MySQL pomocí smyčky?

  3. Zobrazit obrázek na zprávě RDLC z databáze podle cesty obrázku

  4. MySQL SELECT WHERE datum a čas odpovídá dni (a nemusí nutně času)