Indici columnstore cluster e chiavi esterne


18

Sto ottimizzando le prestazioni di un data warehouse utilizzando gli indici. Sono abbastanza nuovo in SQL Server 2014. Microsoft descrive quanto segue:

"Consideriamo l'indice columnstore cluster come standard per l'archiviazione di tabelle dei fatti di data warehouse di grandi dimensioni e prevediamo che verrà utilizzato nella maggior parte degli scenari di data warehousing. Poiché l'indice columnstore cluster è aggiornabile, il carico di lavoro può eseguire un numero elevato di inserimenti, aggiornamenti, ed elimina le operazioni ". http://msdn.microsoft.com/en-us/library/gg492088.aspx

Tuttavia, se leggete più avanti nella documentazione, troverete sotto limitazioni e restrizioni:

"Impossibile avere vincoli univoci, vincoli di chiave primaria o vincoli di chiave esterna."

Questo mi confonde molto! È buona norma (non obbligatorio) disporre di chiavi esterne nel data warehouse per una serie di motivi (integrità dei dati, relazioni visibili per il livello semantico ...)

Quindi Microsoft sostiene gli indici di archivio di colonne in cluster per scenari di data warehouse; tuttavia, non è in grado di gestire le relazioni con le chiavi esterne ?!

Sono corretto su questo? Quali altri approcci consiglieresti? In passato, ho utilizzato un indice columnstore non cluster negli scenari di data warehouse, con drop e ricostruzione per i carichi di dati. Tuttavia, SQL Server 2014 non aggiunge alcun nuovo valore reale per i data warehouse ??


Man mano che la funzionalità matura, vedrai che sempre più di queste funzionalità vengono supportate (diamine, nel 2012, gli indici columnstore erano di sola lettura!). Nel frattempo, ti viene offerto un compromesso: grandi prestazioni con limitazioni o lo stesso vecchio stesso vecchio. Inoltre, non credo che intendessero significare che ogni tabella nel tuo DW dovrebbe avere indici di archivio colonne raggruppati e che nessuna tabella dovrebbe avere alcun vincolo - probabilmente c'è un numero limitato di tabelle in qualsiasi DW che ti darebbe un enorme botto per il secchio.
Aaron Bertrand

3
Attenzione: può gestire i join. Una relazione FK non è assolutamente necessaria per un join. È lì per gestire l'integrità referenziale - che è bello avere ma in un data warehouse PUO 'essere omesso. A rischio, sì, ma anche con un miglioramento delle prestazioni.
TomTom,

8
Inoltre - "nessun vero nuovo valore"? Vuoi dire che essere scrivibili e raggruppati non ti sembrano miglioramenti? Avere gli utenti in grado di interrogare i dati in tempo reale invece di attendere una caduta e ricostruire per ottenere più dati attuali non sembra una buona cosa per i tuoi utenti e meno manutenzione per te? scrollata di spalle
Aaron Bertrand

Puoi avere indici (univoci) creando una vista indicizzata. Sembra che l'infrastruttura per la manutenzione dell'indice sia già lì. È solo che gli indici normali non sono (ancora) implementati.
usr

@AaronBertrand In uno scenario DWH con tabelle dei fatti con chiave esterna l'indice Clustered Columnstore non funziona. Ciò in grande contrasto con Microsoft che si aspetta che questo sia lo standard per l'archiviazione di tabelle dei fatti di grandi dimensioni. Spero che tu possa dimostrare che mi sbaglio ...? Perché mi piace SQL Server.
OverflowStack

Risposte:


13

Hai molte domande qui:

D: (La mancanza di chiavi esterne) mi confonde molto! È buona norma (non obbligatorio) avere Fk nel DWH per una serie di motivi (integrità dei dati, relazioni visibili per il livello semantico, ....)

A: Corretto, in genere è buona norma disporre di chiavi esterne in un data warehouse. Tuttavia, gli indici del columnstore cluster non lo supportano ancora.

D: Quindi MS sostiene gli indici degli archivi delle colonne cluster per scenari DWH, tuttavia non è in grado di gestire le relazioni FK ?!

A: Microsoft ti offre strumenti. Dipende da te come usi questi strumenti.

Se la tua più grande sfida è la mancanza di integrità dei dati nel tuo data warehouse, lo strumento che desideri sono le tabelle convenzionali con chiavi esterne.

Se la tua più grande sfida è rappresentata dalle prestazioni delle query e sei disposto a verificare l'integrità dei tuoi dati come parte del processo di caricamento, lo strumento che desideri sono gli indici cluster di archivio colonne.

D: Tuttavia SQL 2014 non aggiunge alcun nuovo valore reale per DWH ??

A: Per fortuna, il columnstore cluster non è stata l'unica nuova funzionalità di SQL Server 2014. Ad esempio, controlla il nuovo strumento per la stima della cardinalità.

D: Perché sono così arrabbiato e amareggiato per il modo in cui è stata implementata la mia funzione preferita?

A: Mi hai beccato - non hai fatto davvero questa domanda - ma risponderò comunque. Benvenuti nel mondo del software di terze parti in cui non tutto è costruito secondo le vostre specifiche esatte. Se ti senti appassionato di un cambiamento che vorresti vedere in un prodotto Microsoft, dai un'occhiata a Connect.Microsoft.com . È il processo di feedback in cui puoi inviare una modifica, altre persone possono votarla, quindi il team del prodotto lo legge e ti dice perché non lo implementeranno. A volte. Il più delle volte lo segnano semplicemente come "non risolverà, funziona sulla mia macchina" ma, ehi, a volte ottieni delle risposte.


"Corretto, in genere è buona norma disporre di chiavi esterne in un data warehouse" -> SQLCAT - Le 10 migliori best practice per la creazione di un data warehouse relazionale su larga scala ... "Costruire indici non cluster per ogni chiave esterna." -> Nulla sull'applicazione della relazione FK menzionata nel link e il non-CI è ridondante a causa del columnstore, quindi indicherebbe la necessità di FK nella tabella dei fatti, sei d'accordo? Interessato ai tuoi pensieri su questo.
Adrian Torrie,

1
... e per le dimensioni: "Evita di imporre relazioni di chiave esterna tra il fatto e le tabelle delle dimensioni, per consentire un caricamento più rapido dei dati. Puoi creare vincoli di chiave esterna con NOCHECK per documentare le relazioni; ma non applicarle. Assicurare l'integrità dei dati sebbene trasformi le ricerche o esegua i controlli di integrità dei dati alla fonte dei dati "
Adrian Torrie,

6

Posso capire che senti che mancano alcuni pezzi a cui sei abituato. Ma questo è solo perché mancano.

Tuttavia, SQL Server veniva utilizzato con successo quando le chiavi esterne erano solo un concetto (che a quel tempo implementavamo tramite i trigger), non un'implementazione fisica come un vincolo. L'integrità referenziale dichiarativa era presente almeno in SQL Server 7.0, ma molto più debole dell'attuale implementazione.

Per quanto riguarda il valore dell'Indice ColumnStore cluster, fornisce un indice e le righe sono aggiornabili. Potresti trovare utile questa discussione: http://sqlwithmanoj.com/2014/07/24/maintain-uniqueness-with-clustered-columnstore-index-sql-server-2014/

Manoj sottolinea che esiste un modo per creare una vista indicizzata / materializzata nella parte superiore di questa tabella, con la chiave di cluster come PK (prima colonna della tabella / vista). Se ti va bene, ovviamente, è una decisione che devi prendere.

Ma, come hanno commentato Aaron Bertrand e TomTom, si tratta di prestazioni migliori. Se riesci a gestire gli altri problemi che ti riguardano (e credo che siano gestibili), otterrai alcuni vantaggi. Quindi usa ColumnStore per ciò che è in grado di fare e gestire tu stesso le funzionalità mancanti.


2

Questa domanda riguarda SQL 2014, ma desidero fornire ulteriori informazioni alla luce delle modifiche apportate in SQL 2016 agli indici columnstore, poiché può essere difficile risolvere i limiti in diverse versioni e questa domanda è ancora piuttosto elevata su Google:

Per SQL 2016, Microsoft descrive un metodo per utilizzare indici btree non cluster (che ora possono essere aggiunti come indici secondari su una tabella columnstore cluster) per applicare vincoli di chiave esterna, a condizione che il vincolo venga aggiunto prima dell'indice columnstore: https: // docs .microsoft.com / en-us / sql / relazionale-database / indici / columnstore-indici-design-guida

Niko Neugebauer ha anche un post sul blog su questo; in realtà è possibile creare direttamente vincoli univoci / esterni su tabelle columnstore (ho applicato questo approccio nel mio lavoro): http://www.nikoport.com/2015/09/15/columnstore-indexes-part-66- columnstore-miglioramenti-in-sql-server-2016 più cluster-/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.