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

Come migliorare le prestazioni della funzione non deterministica di una colonna in una clausola where o join?

Oltre alla funzione non deterministica, il problema che vedo è che si eseguono calcoli su un campo. Questo (di solito) rende qualsiasi indice sul campo inutilizzabile dalla query.

Il secondo paragrafo di questo link (Dieci errori comuni di programmazione SQL (funzioni su colonne indicizzate nei predicati) ) fornisce informazioni più dettagliate su quando ciò accade, su come evitarlo e su come a volte gli ottimizzatori possono utilizzare gli indici nonostante l'uso delle funzioni.

In breve, invece di fare affidamento su ottimizzatori migliorati, è spesso possibile modificare la query mantenendo intatto il campo (senza eseguire calcoli su di esso), ma invece eseguendo i calcoli (invertiti) sugli altri valori. Nel tuo caso alla data corrente fornita da GetDate() . Quindi la query può utilizzare l'indice del campo table1.Date .

Quindi, puoi usare qualcosa come:

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

E devi solo trovare le funzioni che ti portano il primo e l'ultimo giorno del mese in corso.

Questo post del blog può aiutarti:sql-server-query-per-trovare-primo-e-ultimo-giorno-del-mese-corrente/

Ancora meglio, questa domanda/risposta StackOverflow:il-modo-più-semplice-per-creare-una-data-che-è-il-primo-giorno-del-mese-dato -un'altra data

Dovrò testare ma penso che questa leggera variazione di quanto sopra andrà bene:

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)