Buongiorno a tutti.
Ho un trigger che cerca di forzare una regola la quale impone che un certo record non abbia doppioni in un certo range di tempo.
In altre parole ho una tabella T con i campi (C1,C2,C3,RangeStart,RangeEnd,C4,C5...,CN), voglio forzare la regola seguente:
Non possono esistere due record con identici C1,C2,C3 per i quali ci sia una sovrapposizione di date di validità
Esempio
Se la tabella contiene un record con Range Start '2012-01-01', Range End '2012-01-31' e l'utente vuole inserire un nuovo record con C1,C2,C3 identici al precedente record ma con Range Start = '2012-02-01',Range End='2012-02-29' l'inserimento va a buon fine, se invece l'utente inserisce un record con RangeStart='2011-12-20',RangeEnd='2012-01-14' l'inserimento fallisce perchè il range di date di questo record si sovrappone per 14 giorni al record già esistente.
Ho quindi creato la vista V_DOPPIONI che restituisce tutti i records che violano la regola di cui sopra.
Nella tabella T ho aggiunto il seguente trigger
Il tempo di escuzione del trigger è inaccettabile.codice:CREATE TRIGGER [dbo].[T_NO_DOPPIONI] ON T FOR INSERT, UPDATE AS BEGIN SET NOCOUNT ON IF EXISTS ( SELECT * FROM V_DOPPIONI ) BEGIN RAISERROR('CANNOT HAVE SAME VALUES OVERLAPPING DATETIME RANGES, PLEASE CHECK DATE AND TIME RANGES', 16,1) ROLLBACK END END
Il problema è che la vista V_DOPPIONI ritorna in tempo zero, aggiungendo IF EXISTS il tempo di esecuzione supera i 40 secondi, mi chiedo come sia possibile, dal momento che nel peggiore dei casi il motore di database dovrebbe metterci un nanosecondo in piu rispetto al caso dell'esecuzione completa della query.
Per riepilogare il mio problema attuale è il seguente:
Quale costrutto alternativo posso utilizzare per imporre la condizione di cui sopra alla mia tabella T o in alternativa come posso fare a rendere veloce la clausola IF EXISTS?codice:SELECT * FROM v_doppioni --tempo esecuzione 0 secondi IF EXISTS(SELECT * FROM v_doppioni) BEGIN PRINT 'ESISTONO DOPPIONI' END -- 40 secondi e oltre.
Grazie a tutti.

Rispondi quotando