Molti problemi che richiedono denormalizzazione e/o operazioni sequenziali possono essere gestite eccezionalmente bene dal CLR e possono essere utilizzati per migliorare notevolmente le prestazioni senza sacrificare l'usabilità sull'estremità SQL (tanto). Invece di affidarsi interamente a operazioni basate su set o iterative, puoi adottare un approccio ibrido, utilizzare una soluzione basata su set per le grandi tratte e passare a un modello iterativo per i loop stretti.
I tipi integrati hierarchyid
e geospaziali (ovvero geography
) in SQL Server 2008 sono buoni esempi del problema denormalizzazione. Entrambi contengono una quantità di dati (quasi) arbitrariamente difficili da normalizzare senza compromettere le prestazioni: è necessario ricorrere a ricorsioni o cursori per eseguire altrimenti un lavoro significativo con loro, oppure utilizzare un numero di trigger e/o attività pianificate per ratto mantenere una tabella denormalizzazione.
Un altro problema che ho risolto con i tipi CLR è la compressione in linea. Questo potrebbe sembrare un esercizio inutile o accademico, ma quando i dati completamente normalizzati stanno spingendo nel terabyte, una riduzione dell'80-90% delle dimensioni significa molto. Ora SQL ha la sua compressione incorporata e SQL 2005 ha il vardecimal, e anche quelli sono buoni strumenti, ma un algoritmo di "minimizzazione" consapevole del dominio può essere più volte più efficiente in termini di carico della CPU e di compressione. Ovviamente questo non si applica ad ogni problema, ma si applica ad alcuni.
Ancora un altro problema molto frequente trovato in questo sito è generare una sequenza al volo - ad esempio una sequenza di date consecutive.Le soluzioni comuni sono CTE ricorsive, tabelle di sequenze statiche e le note tabelle spt_values
poco note, ma una semplice UDF CLR offre prestazioni migliori di tutte e offre una maggiore flessibilità.
Ultimo nella mia lista: Gli aggregati di streaming definiti dall'utente sono anche molto utili, specialmente per qualsiasi argomento relativo alle statistiche. Ci sono alcune cose che non puoi semplicemente comporre dagli aggregati SQL incorporati, come mediane, medie mobili ponderate, ecc. Gli UDA possono anche prendere più argomenti in modo da poterli parametrizzare; tecnicamente non è garantito che un aggregato riceva dati in un ordine particolare nella versione corrente di SQL Server, ma è possibile aggirare tale limite alimentandolo a ROW_NUMBER
come argomento aggiuntivo e utilizzarlo per implementare praticamente qualsiasi funzione di windowing (avere l'aggregato sputa un UDT che può quindi essere trasformato in una tabella).
In realtà è davvero frustrante il numero limitato di esempi di applicazioni SQL-CLR veramente utili; cerca su Google e otterrai 10 milioni di risultati, ognuno dei quali per una sciocca concatenazione di stringhe o regex. Questi sono utili, ma prendi qualche minuto per conoscere gli UDT e gli UDA di SQL in particolare e inizierai a vedere molti usi per loro nelle tue applicazioni. Non impazzire, ovviamente - pensa attentamente se esiste o meno una soluzione migliore in puro SQL - ma non sottovalutali neanche.
Questo è uno dei post più istruttivi che abbia mai letto. Grazie. –
+1 mette molto bene –