Ottimizzazione check

lunedì 01 marzo 2010 - 12.28

ciccioherz Profilo | Junior Member

ciao, avrei bisogno di un suggerimento..
ho una tabella con dei dati anagrafici di alcuni clienti, tra cui tre colonne (dataIscrizione, dataScadenza, attivo).

sto cercando un modo (che però non sprechi troppe risorse) per impostare attivo su false se la dataScadenza coincide o è minore della data odierna, dove per odierna si intende la data in cui ad esempio viene eseguito l'accesso al db tramite connessione, o query.

secondo voi il metodo piu classico e convenzionale sarebbe quello di mettere un check sulla colonna attivo?

grazie

lbenaglia Profilo | Guru

>secondo voi il metodo piu classico e convenzionale sarebbe quello
>di mettere un check sulla colonna attivo?

No, quello di trasformare la colonna Attivo in una colonna calcolata.
I check constraint sono dei vincoli sui dati che ne determinano la validità.

USE tempdb; CREATE TABLE dbo.foo( dataIscrizione date NOT NULL, dataScadenza date NOT NULL, attivo AS ( CASE WHEN dataIscrizione <= CURRENT_TIMESTAMP THEN 0 ELSE 1 END ) ); INSERT dbo.foo VALUES('20100101', '20100201'); INSERT dbo.foo VALUES('20100301', '20100401'); INSERT dbo.foo VALUES('20100302', '20100402'); INSERT dbo.foo VALUES('20100501', '20100601'); SELECT * FROM dbo.foo; /* Output: dataIscrizione dataScadenza attivo -------------- ------------ ----------- 2010-01-01 2010-02-01 0 2010-03-01 2010-04-01 0 2010-03-02 2010-04-02 1 2010-05-01 2010-06-01 1 (4 row(s) affected) */ DROP TABLE dbo.foo;

>grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

ciccioherz Profilo | Junior Member

intanto grazie..però manca ancora qualcosa:

oggi inserisco i dati e attivo risulta true perche supponiamo che la scadenza sia domani.

domani però, il campo attivo sarà sempre true..mentre io vorrei si impostasse su false..quale "evento" del db potrei scegliere secondo te..?

lbenaglia Profilo | Guru

>oggi inserisco i dati e attivo risulta true perche supponiamo
>che la scadenza sia domani.
>
>domani però, il campo attivo sarà sempre true..mentre io vorrei
>si impostasse su false..quale "evento" del db potrei scegliere
>secondo te..?
Nell'esempio riportato ho utilizzato per errore la colonna dataIscrizione, ovviamente intendevo dataScadenza.
Ora, se la scadenza è domani, attivo varrà 1.
Domani varrà 0 in quanto il valore è sempre calcolato "al volo" ad ogni query:

USE tempdb; CREATE TABLE dbo.foo( dataIscrizione date NOT NULL, dataScadenza date NOT NULL, attivo AS ( CASE WHEN dataScadenza <= CURRENT_TIMESTAMP THEN 0 ELSE 1 END ) ); INSERT dbo.foo VALUES('20100101', '20100201'); INSERT dbo.foo VALUES('20100225', '20100228'); INSERT dbo.foo VALUES('20100301', '20100301'); INSERT dbo.foo VALUES('20100301', '20100302'); SELECT * FROM dbo.foo; /* Output: dataIscrizione dataScadenza attivo -------------- ------------ ----------- 2010-01-01 2010-02-01 0 2010-02-25 2010-02-28 0 2010-03-01 2010-03-01 0 2010-03-01 2010-03-02 1 (4 row(s) affected) */ DROP TABLE dbo.foo;

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

ciccioherz Profilo | Junior Member

Ah..perdona l'insistenza..ne sei sicuro di questo?

Il valore viene calcolato davvero "al volo" su ogni query? (in particolare per le select e update sull'intera tabella)?

Io credevo fosse un valore calcolato solo durante la creazione di un nuovo record..

lbenaglia Profilo | Guru

>Ah..perdona l'insistenza..ne sei sicuro di questo?
Si.

>Il valore viene calcolato davvero "al volo" su ogni query? (in
>particolare per le select e update sull'intera tabella)?
Dato che la colonna non è configurata come PERSISTED, verrà valutata solo in fase di SELECT.

>Io credevo fosse un valore calcolato solo durante la creazione
>di un nuovo record..
No, ad ogni SELECT.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5