sql >> Databasteknik >  >> RDS >> Sqlserver

Hur förbättrar man prestanda för icke-deterministisk funktion för en kolumn i en where-sats eller join?

Förutom den icke-deterministiska funktionen är problemet jag ser att man gör beräkningar på ett fält. Detta gör (vanligtvis) alla index i fältet oanvändbara av frågan.

Det andra stycket i denna länk (Tio vanliga SQL-programmeringsmisstag (funktioner på indexerade kolumner i predikat) ) ger mer detaljerad information om när detta händer, hur man undviker det och hur ibland optimerare kan använda index trots användning av funktioner.

Kort sagt, istället för att förlita sig på förbättrade optimerare, är det ofta möjligt att ändra frågan genom att hålla fältet intakt (utan att göra några beräkningar på det), men istället göra de (omvända) beräkningarna till de andra värdena. I ditt fall till det aktuella datumet som tillhandahålls av GetDate() . Då kan frågan använda indexet för fältet table1.Date .

Så du kan använda något som:

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

Och du behöver bara hitta funktioner som ger dig den första och sista dagen i innevarande månad.

Det här blogginlägget kan hjälpa dig:sql-server-query-to-find-first-and-last-day-of-current-month/

Ännu bättre, denna StackOverflow-fråga/svar:enklaste-sättet-att-skapa-ett-datum-som-är-den-första-dagen-i-månaden-given -ett annat-datum

Jag måste testa men jag tror att denna lilla variation av ovanstående kommer att göra:

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. ändra tabellsläppkolumn i Oracle-databasen

  2. Skapa en ODBC-länkad server utan att konfigurera en datakälla

  3. Kör ett skalskript när en databaspost skrivs till postgres

  4. MySQL korrumperar efter varje omstart av servern