Voglio memoizzare i risultati delle funzioni per le prestazioni, ad esempio compilare pigramente una cache indicizzata sugli argomenti della funzione. La prima volta che chiamo una funzione, la cache non avrà nulla per gli argomenti di input, quindi la calcolerà e la memorizzerà prima di restituirla. Le chiamate successive usano solo la cache.Risultati della funzione di memorizzazione nella cache in SQL Server 2000
Tuttavia, sembra che SQL Server 2000 abbia una regola arbitraria stupida sulle funzioni "deterministiche". INSERT, AGGIORNAMENTI e chiamate di stored procedure regolari sono vietati. Tuttavia, sono consentite procedure archiviate estese. Come è questo deterministico? Se un'altra sessione modifica lo stato del database, l'output della funzione cambierà comunque.
Sto fumando pazzo. Avevo pensato di rendere la cache trasparente per l'utente. È possibile? Non dispongo delle autorizzazioni per l'implementazione di stored procedure estese.
EDIT:
Questa limitazione è ancora nel 2008. Non è possibile chiamare RAND, per l'amor di Dio!
La cache verrà implementata da me nel DB. La cache è qualsiasi archivio dati usata per la cache ...
EDIT:
ci sono casi in cui gli stessi argomenti a una funzione produrrà risultati diversi, al di fuori delle modifiche ai dati sottostanti. Questa è una piattaforma BI e le uniche modifiche provengono dall'ETL programmato, durante il quale avrei TRONCATO la tabella della cache.
Questi sono calcoli di serie temporali di I/O intensivo, dell'ordine di O (n^4). Non ho il mandato per modificare la tabella o gli indici sottostanti. Inoltre, molte di queste funzioni utilizzano le stesse funzioni intermedie e il caching consente di utilizzarle.
Le UDF non sono realmente deterministiche, a meno che non tengano conto dei cambiamenti nello stato del database. Qual e il punto? La memorizzazione nella cache di SQL Server è? (Ironico.) Se SQL Server è la memorizzazione nella cache, quindi deve essere in scadenza su modifiche alle tabelle che sono legati allo schema. Se sono legati allo schema, allora perché non legare le tabelle modificate dalla funzione? Posso capire perché i proc non sono permessi, anche se questo è solo sciatto; solo schema bind procs. E, BTW, perché consentire processi estesi memorizzati? Non è possibile tenere traccia di ciò che fanno questi per garantire il determinismo !!! Argh !!!
EDIT:
La mia domanda è: C'è un modo per pigramente risultati funzione di cache in un modo che può essere utilizzato in una vista?
Mi dispiace, non mi era chiaro dal tuo post originale che stavi creando la cache "da zero". Come intendevi trattare casi in cui la stessa funzione, con gli stessi argomenti, dovrebbe restituire risultati diversi? –
qual è la tua domanda? –