sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan forbedres ydeevnen af ​​ikke-deterministisk funktion af en kolonne i en where-klausul eller join?

Udover den ikke-deterministiske funktion, er problemet, jeg ser, at man laver beregninger på et felt. Dette gør (normalt) ethvert indeks på feltet ubrugelig af forespørgslen.

Det andet afsnit af dette link (Ti almindelige SQL-programmeringsfejl (funktioner på indekserede kolonner i prædikater) ) giver mere detaljeret information om, hvornår dette sker, hvordan man undgår det, og hvordan optimeringsprogrammer nogle gange kan bruge indekser på trods af brugen af ​​funktioner.

Kort sagt, i stedet for at stole på forbedrede optimeringsværktøjer, er det ofte muligt at ændre forespørgslen ved at holde feltet intakt (uden at lave nogen beregninger på det), men i stedet udføre de (omvendte) beregninger til de andre værdier. I dit tilfælde til den aktuelle dato, der er leveret af GetDate() . Derefter kan forespørgslen bruge indekset for feltet table1.Date .

Så du kan bruge noget som:

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

Og du behøver kun at finde funktioner, der giver dig den første og sidste dag i den aktuelle måned.

Dette blogindlæg kan hjælpe dig:sql-server-query-to-find-first-and-last-day-of-current-month/

Endnu bedre, dette StackOverflow-spørgsmål/svar:enkleste-måde-at-oprette-en-dato-der-er-den-første-dag-i-måneden-givet -anden-dato

Jeg bliver nødt til at teste, men jeg tror, ​​at denne lille variation af ovenstående vil gøre:

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. mysql vælg tidsstempler mellem a og b og returnerer alle eller 0 tidsstempler

  2. Brug af symfoni med postgresql

  3. Forkert output i FULL OUTER JOIN-forespørgslen

  4. Ingen dubletter i SQL-forespørgsel