sql >> Database >  >> RDS >> Sqlserver

Hoe de prestaties van de niet-deterministische functie van een kolom in een where-clausule of join te verbeteren?

Naast de niet-deterministische functie, is het probleem dat ik zie, dat je berekeningen maakt op een veld. Dit maakt (meestal) elke index op het veld onbruikbaar door de zoekopdracht.

De tweede alinea van deze link (Tien veelvoorkomende SQL-programmeerfouten (functies op geïndexeerde kolommen in predikaten) ) geeft meer gedetailleerde informatie over wanneer dit gebeurt, hoe u dit kunt vermijden en hoe optimizers soms indexen kunnen gebruiken ondanks het gebruik van functies.

Kortom, in plaats van te vertrouwen op verbeterde optimizers, is het vaak mogelijk om de query te wijzigen door het veld intact te houden (zonder er berekeningen op uit te voeren), maar in plaats daarvan de (omgekeerde) berekeningen uit te voeren naar de andere waarden. In uw geval tot de huidige datum die wordt verstrekt door GetDate() . Dan kan de query de index van het veld table1.Date . gebruiken .

U kunt dus iets gebruiken als:

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

En u hoeft alleen maar functies te vinden waarmee u de eerste en laatste dag van de huidige maand krijgt.

Deze blogpost kan je helpen:sql-server-query-to-find-first-and-last-day-of-current-month/

Nog beter, deze StackOverflow vraag/antwoord:eenvoudigste-manier-om-een-datum-die-de-eerste-dag-van-de-maand-is-aan-te-maken -een andere datum

Ik zal het moeten testen, maar ik denk dat deze kleine variatie op het bovenstaande voldoende is:

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. Dubbele sleutel bij schrijven of bijwerken?

  2. formaat interval met to_char

  3. Hoe MySQL onder XAMPP te configureren om met IPv6 te werken

  4. SQL Server converteert string naar datetime