Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak poprawić wydajność niedeterministycznej funkcji kolumny w klauzuli WHERE lub złączenia?

Poza funkcją niedeterministyczną, problem, który widzę, polega na tym, że wykonujesz obliczenia na polu. To (zazwyczaj) sprawia, że ​​żaden indeks w polu nie nadaje się do użycia przez zapytanie.

Drugi akapit tego linku (Dziesięć typowych błędów programowania SQL (funkcje na indeksowanych kolumnach w predykatach) ) zawiera bardziej szczegółowe informacje o tym, kiedy tak się dzieje, jak tego uniknąć i jak czasami optymalizatorzy mogą używać indeksów pomimo korzystania z funkcji.

Krótko mówiąc, zamiast polegać na ulepszonych optymalizatorach, często można zmienić zapytanie, zachowując nienaruszone pole (bez wykonywania na nim żadnych obliczeń), ale zamiast tego wykonując (odwrócone) obliczenia na inne wartości. W twoim przypadku do aktualnej daty podanej przez GetDate() . Wtedy zapytanie może użyć indeksu pola table1.Date .

Możesz więc użyć czegoś takiego:

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

Musisz tylko znaleźć funkcje, które zapewnią Ci pierwszy i ostatni dzień bieżącego miesiąca.

Ten wpis na blogu może Ci pomóc:zapytanie-do-serwera-sql, aby znaleźć-pierwszy-i-ostatni-dzień-bieżącego-miesiąca/

Co więcej, to pytanie/odpowiedź StackOverflow:najprostszy-sposób-utworzenia-daty-której-jest-pierwszy-dzień-miesiąca-podany -inna-data

Będę musiał przetestować, ale myślę, że ta niewielka zmiana powyższego wystarczy:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Korzystanie z kolumny TIME SQL Server 2008 w deklaracji klasy

  2. Oblicz sumę bieżącą w SQL Server

  3. Jak pisać dynamiczne kolumny zapytań w wierszach w SQL Server?

  4. Jak podłączyć aplikację Android do SQL Server poprzez jbdc?

  5. Użyć liczby zmiennoprzecinkowej lub dziesiętnej dla kwoty w dolarach w aplikacji księgowej?