none
Indice su un campo calcolato RRS feed

  • Domanda

  • Salve a tutti. Vorrei costruire un indice su una tabella, che viene interrogata tramite il convert(date,ENDTIME) dove ENDTIME è un campo datetime. Per questo vorrei creare un indice convert(date,ENDTIME) per velocizzare l'interrogazione. Non vorrei creare un campo che sia convert(date,ENDTIME) in quanto la struttura della tabella non è stata fatta da me. Qualche consiglio?

    Ciao

    martedì 9 agosto 2011 12:42

Tutte le risposte

  • Ciao,

    per aggiungere un indice su un campo calcolato, ti serve per forza un campo calcolato :), e questo comporta la modifica dello schema della tabella. Per aggiungere un campo calcolato (SQL Server 2005 o superiore) puoi fare:

    ALTER TABLE dbo.MiaTabella ADD EndTimeCalc AS CONVERT(date, ENDTIME)
    

    A questo punto, puoi creare un indice sul campo EndTimeCalc: 

    CREATE NONCLUSTERED INDEX NCIX_MiaTabella_EndTimeCalc ON dbo.MiaTabella (EndTimeCalc)
    

    Ora puoi scrivere la query in questo modo per usare l'indice:

    SELECT <campi> FROM dbo.MiaTabella WHERE EndTimeCalc=<valore di tipo date> 
    

    ma anche se fai:

    SELECT <campi> FROM dbo.MiaTabella WHERE CONVERT(date, ENDTIME)=<valore di tipo date>
    

    SQL Server capisce che esiste un indice su un campo calcolato corrispondente a quella formula e lo usa.

    HTH


    Alberto Dallagiacoma
    My Italian Blog: http://blogs.ugidotnet.org/alby
    Twitter: http://twitter.com/albertodall
    DotDotNet - User Group .NET Emilia Romagna: http://www.dotdotnet.org






    martedì 9 agosto 2011 14:58
  • Ok. Grazie. Conoscevo questa strada e temevo fosse l'unica.Infatti. Farò in questo modo, visto che ho sql server 2008 standard edition e non posso creare una vista indicizzata.

    Grazie, ciao

    Pasquale

    martedì 9 agosto 2011 15:32
  • Ciao Pasquale,

    Due osservazioni. Anzitutto puoi creare viste indicizzate su una versione qualunque di Sql Server. L'unica differenza è che la versione enterprise accede automaticamente all'indice su vista (cosa tra l'altro vera si e no) mentre con le altre versioni bisogna riferirsi esplicitamente alla vista con l'opzione NOEXPAND.

    L'altra considerazione però è che l'indice su un datetime ordina i records sostanzialmente in un modo identico ad un indice su un campo date e quindi basta un indice sul secondo per avere la velocità massima. Ovviamente la query andrà scritta adeguatamente, per esempio:

    where CampoDate='20110108'

    assumerà una forma del tipo:

    where CampoDateTime>='20110108' and  CampoDateTime<'20110208' 

    l'effetto è identico, risparmia inutili complessità, risparmia spazio e sfrutterà l'indice, se disponibile, su CampoDatetime.

    marc.

    giovedì 11 agosto 2011 07:34