Group: microsoft.public.it.sql




Subject: Consiglio su creazione indice
From: AlessandroD
Date: 5/7/2007 11:27:56 AM
Diego wrote: > "Marcello" ha scritto: > >> i filtri su funzioni [in queto caso YEAR(dbo.Fatture.Datafattura)] >> inibiscono l'uso di qualsiasi indice e richiedono sempre un table >> scan. Tale soluzione è possibile quindi per tabelle di dimesioni >> compatibili con questa considerazione. > > GIUSTO!!! > Allora se inserisco il campo Anno con valore predefinito = > year(DataFattura) e poi faccio il filtro su anno? > Se sul campo calcolato Anno non ci crei un indice, non avrai nessun beneficio, visto che senza un indice definito su quel campo, Anno non esisterà di fatto da nessuna parte ma verrà calcolato a run-time in continuazione. Quindi filtrare su Anno senza averci creato un indice e filtrare su year(Fattatura) sono la stessa cosa da un punto di vista delle prestazioni. Ciao, Alessandro

Subject: Consiglio su creazione indice
From: Lorenzo Benaglia
Date: 5/7/2007 1:18:33 PM
Diego wrote: > Forse mi sono espresso male, ma io non intendevo una colonna > calcolata. ma di aggiungere un campo "Anno" di tipo [nchar](4) con > DEFAULT (N'year(DTfatt)'). Ciao Diego, Da quando in qua gli anni sono espressi in formato alfanumerico? :-D L'idea di denormalizzare la tabella per un motivo così "banale", la scarterei in partenza. Puoi risolvere brillantemente la questione indicizzando la colonna datetime (possibilimente con un indice clustered, oppure non clusterd se si tratta di una query coperta) e ricorrendo all'operatore BETWEEN: ... WHERE Datafattura BETWEEN @From AND @To dove @From e @To sono due variabili (o parametri di una stored procedure|UDF) che contengono rispettivamente la data di partenza (ad es. '20070101') e la data di destinazione ('20071231 23:59:59.997'). > A proposito, io ho fatto questa modifica alla tabella dalla modoalità > visuale di SQL Server Menagement, e lui mi ha aggiunto > automaticamente N' Che vuol dire? N è utilizzata per indicare che il valore seguente è una stringa in formato UNICODE (2 Bytes per carattere). Questo significa che in SSMS hai definito la colonna Anno con un data type UNICODE (nchar, nvarchar o ntext). Ciao! -- Lorenzo Benaglia Microsoft MVP - SQL Server http://blogs.dotnethell.it/lorenzo http://italy.mvps.org

Subject: Consiglio su creazione indice
From: AlessandroD
Date: 5/7/2007 1:20:39 PM
Diego wrote: > > Forse mi sono espresso male, ma io non intendevo una colonna > calcolata. ma di aggiungere un campo "Anno" di tipo [nchar](4) con > DEFAULT (N'year(DTfatt)'). > E se l'operatore quando salva una fattura per sbaglio canna l'anno, quindi va in correzione, aggiorna la data, e tu ti trovi con DTfatt riferita ad un anno diverso da quello contenuto nel campo anno? Per me è meglio se segui l'esempio di Marcello dove ti ha proposto un campo calcolato vero e proprio, che quindi è sempre e costantemente legato alla data della fattura. E in ogni caso, ancora, se su quel campo non ci crei un indice, non avrai comunque nessun beneficio nelle perforamance rispetto al filtro fatto ua year(DTfatt). > A proposito, io ho fatto questa modifica alla tabella dalla modoalità > visuale di SQL Server Menagement, e lui mi ha aggiunto > automaticamente N' Che vuol dire? > E la sintassi per indicare delle costanti stringa in formato unicode. Guarda il BOL per maggiori dettagli. Ciao, Alessandro