2009-11-04 18 views
5

Ho un database contenente tabelle con oltre 600 milioni di record e un insieme di stored procedure che rendono complesse operazioni di ricerca sul database. Le prestazioni delle stored procedure sono così lente anche con gli indici appropriati sulle tabelle. Il design del database è un normale disegno relazionale db. Desidero modificare la progettazione del database in modo multidimensionale e utilizzare le query MDX invece delle tradizionali query T-SQL, ma la domanda è: La query MDX è migliore della tradizionale query T-SQL in relazione alle prestazioni? e in caso affermativo, in che misura ciò migliorerà le prestazioni delle query?Prestazioni MDX rispetto a T-SQL

Grazie per qualsiasi aiuto.

+0

correlati: http://stackoverflow.com/questions/42483/simulated-olap/42504#42504 –

risposta

13

Mele e arance: un servizio di analisi Il cubo OLAP è un tipo di archiviazione fondamentalmente diverso rispetto a un database di SQL Server e sono progettati per fare cose diverse. Tecnicamente MDX non è "più veloce" di T-SQL, o viceversa - sono solo linguaggi, ma progettati per esigenze diverse.

Detto questo, un cubo è solitamente quello che funziona meglio per fare numerico analisi di dati statici, come l'aggregazione di un gran numero di vendite/transazioni/qualsiasi record nel tempo. Al contrario, un database relazionale tradizionale generalmente funziona bene, se lo schema e gli indici sono ben costruiti, per la ricerca. Un modo semplice per giudicare: se le query SQL hanno a che fare un sacco di

select grock, sum/min/max/avg(foo) 
from bar 
group by grock -- Ideal Analysis Services problem 

poi un cubo può aiutare (è stato progettato per le funzioni matematiche di aggregazione - sum() e il gruppo da). OTOH se le query fanno un sacco di

select cols 
from foo 
where <complicated search> -- Not so much 

poi un cubo probabilmente non aiuterà, e mi si concentrerà invece sulla messa a punto lo schema, le query e indicizzazione, e il partizionamento forse tavolo se i dati possono essere opportunamente partizionati.

Si dispone di un indice cluster e di indici non cluster che corrispondono alle query?

2

"Le prestazioni delle stored procedure è così lento anche con opportuni indici"

sarei sorpreso se la stored procedure è il vero problema, forse il modo in cui vengono utilizzate le procedure è lento, ma un la stored procedure per definizione non lo rende lento. Hai scoperto e le tue procedure sono lente? Le hai profilate? Prima di ridisegnare il mio database, darei un'occhiata approfondita a questa strada. I database multidimensionali sono per OLAP il tuo database è strettamente un database OLAP o è un ibrido di OLAP e OLTP? Forse hai bisogno di de-normalizzare e replicare i dati nel tuo progetto OLTP nella struttura de-normalizzare d? 600 milioni di dischi in un tavolo non sono affatto enormi, non è piccolo ma questo non mi porta a credere che la rimozione di stored procedure renderà magicamente le cose veloci. Profili i tuoi proc memorizzati e vedi dove sono i colli di bottiglia delle prestazioni prima di saltare in un progetto più grande per risolvere il problema.

+0

una semplice query del tipo: [select id da articoli in cui NomeCategoria in ('A', 'B', 'C')] con un indice su CategoryName impiega circa 60 secondi per ottenere il risultato. Tra l'altro il database contiene solo dati statici ma è stato progettato come database OLTP. –

+0

Che piano di query ti offre? Quante righe restituisce? L'ID della colonna è indicizzata? L'IN on ('A', 'B', 'C') non sarà in grado di usare un indice. – Kuberchaun

+0

Ecco un collegamento con alcuni suggerimenti di alto livello che potrebbero essere utili http://blogs.techrepublic.com.com/datacenter/?p=173 – Kuberchaun

6

MS SSAS cubo OLAP può essere utilizzato in diverse modalità di stoccaggio:

  1. Relational OLAP() - i dati ei metadati rimane nel DB e pochi altri materializzata vengono aggiunti punti di vista. Può o non può essere più veloce.

  2. Ibrido (HOLAP) - i metadati e le aggregazioni (pre-calcolate) vengono archiviati su un nuovo server che esegue un'istanza SSAS. Ciò dovrebbe accelerare tutte le query utilizzando aggregazioni, come "ore totali dei dipendenti per l'anno scorso per mese", ma le query che eseguono il drill-through su record specifici possono essere come prima.

  3. OLAP multidimensionale (MOLAP) in cui tutti i dati e i metadati e le aggregazioni vengono copiati sul server SSAS. Di solito è il più veloce, ma duplica la memoria.

Prima di iniziare questo, si dovrebbe prendere in considerazione si ottimizzare il layout tavolo per reporting e analisi, in altre parole utilizzano un data warehouse (DW) - mettere i dati in una dimensione stella Kimball e tabelle dei fatti. Quindi caricare il DW utilizzando ETL (SSIS) periodicamente e indirizzare i report e le analisi al DW. È possibile che non sia necessario utilizzare SSAS - le query SQL in esecuzione su tabelle di stelle sono in genere notevolmente più veloci rispetto a un database operativo normalizzato. Se questo è ancora troppo lento, costruire i cubi SSAS sopra il DW. Una volta avviato il caricamento del DW, è possibile rimuovere i record dal database operativo, rendendolo più veloce per l'uso quotidiano.


Per riassumere, la mia regola empirica sarebbe:
1. Creare un DW e impostare il processo ETL
2. Provare i report T-SQL sul DW, potrebbe essere sufficiente.
3. Se ancora lento, creare i cubi SSAS (sopra il DW) in modalità HOLAP e utilizzare MDX per interrogarli.

Problemi correlati