xVelocity in Deep Marco Pozzan

Slides:



Advertisements
Presentazioni simili
Gestione della memoria centrale
Advertisements

Modulo 1 – Ambiente di lavoro Windows 7
DBMS (DataBase Management System)
SQL applicato a SQL Server
Miglioramento della protezione dei dati mediante SQL Server 2005 Utilizzo della crittografia di SQL Server 2005 per agevolare la protezione dei dati Pubblicato:
Introduzione alla tecnologia OLAP: Microsoft SQL Analisys Services
Introduzione al datawarehouse
Structured Query Language (SQL) Presentazione 13.1 Informatica Generale (Prof. Luca A. Ludovico)
File System Cos’è un File System File e Directory
Gestione del processore
Connessione con MySQL.
Biglietti e Ritardi: schema E/R
Data warehousing con SQL Server
Biglietti e Ritardi: schema E/R
1 Misura Derivata: esempio dei biglietti CostoMedioBiglietto (CMB) calcolato come INCASSO/NUM_BIG. SUM AVG Implementazione in Analysis Services 1. Si definisce.
Biglietti: schema E/R.
1 Biglietti: schema E/R. 2 Biglietti: albero degli attributi.
DATAWAREHOUSE - Microstrategy
Realizzazione del file system
Memoria virtuale Memoria virtuale – separazione della memoria logica dell’utente dalla memoria fisica. Solo alcune parti di un programma devono trovarsi.
Interfaccia del file system
Realizzazione del file system
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 5 – Info B Marco D. Santambrogio – Riccardo Cattaneo –
File.
Algoritmi e strutture dati
Access: Query semplici
IL FORMATO DEI FILE E IL FILETYPE (ESTENSIONE) Formato dei file 10 marzo 2012 Informatica prof. Giovanni Raho anno
Basi di dati Università Degli Studi Parthenope di Napoli
SQL: Lezione 7 Nataliya Rassadko
Algoritmi e Strutture Dati
Corso di Laurea in Ingegneria per lAmbiente e il Territorio Informatica per lAmbiente e il Territorio Docente: Giandomenico Spezzano Tutor: Alfredo Cuzzocrea.
Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.
Daniel Stoilov Tesi di Laurea
SELECT STATEMENT Clausola WHERE permette di limitare il numero di record da estrarre SELECT */ [DISTINCT] colonna/ espressione [alias],… FROM table [WHERE.
Viste. Cosè una vista? è possibile creare un subset logico di dati o una combinazione di dati una vista è una tabella logica basata su una tabella o su.
Creazione e manipolazione tabelle. TABELLE una tabella può essere creata in qualsiasi momento,anche quando gli utenti stanno usando il database la struttura.
DBMS ( Database Management System)
Corso di INFORMATICA anno scolastico 2009/10 Linguaggio SQL IDENTIFICATORI di tabelle e attributi: stringhe di lunghezza max 18 caratteri, composte da.
NotCron tutti gli interventi di manutenzione programmata dello stabilimento for
Elementi di Informatica di base
Modulo 1 - Concetti di base della Tecnologia dell'Informazione
Esercizio 10.* Un cassiere vuole dare un resto di n centesimi di euro usando il minimo numero di monete. a) Descrivere un algoritmo goloso per fare ciò.
Business Intelligence Semantic Model Tomislav Piasevoli SoftPro Tetral d.o.o.
Algoritmi e Strutture Dati
Gerarchie Ricorsive Una gerarchia ricorsiva deriva dalla presenza di una ricorsione o ciclo (un anello nel caso più semplice) nello schema operazionale.
BIOINFO3 - Lezione 51 INSERIMENTO DEI DATI Visto come si creano le tabelle (sinora tristemente vuote), cominciamo ad occuparci di come riempirle con dei.
CORSI DI FORMAZIONE - Basi di Dati: MySql - Parte 4 - Dicembre Utenti e privilegi del database - 1 Root è lutente amministratore predefinito, ma.
Threads.
Corso di Informatica Corso di Laurea in Conservazione e Restauro dei Beni Culturali Gianluca Torta Dipartimento di Informatica Tel: Mail:
Complessità di un algoritmo
1 Data warehousing con SQL Server SQL Server è un RDBMS (Relational DataBase Management System) Analysis Services è un componente di SQL Server che offre.
ITCG “V. De Franchis” - PON FSE Modulo G/1 l’informatica”
#sqlsatPordenone #sqlsat367 February 28, 2015 Ricerche full-text Emiliano Pinto
I DATABASE.
Modulo 5 - Database. Contenuti della lezione 5.1.1Concetti Fondamentali 5.1.2Organizzazione di un Database 5.1.3Relazioni 5.2.1Lavorare con i database.
Cloud SIA V anno. Introduzione ai Data Warehouse.
1 Gestione della Memoria. 2 Idealmente la memoria dovrebbe essere –grande –veloce –non volatile Gerarchia di memorie –Disco: capiente, lento, non volatile.
Didattica e Fondamenti degli Algoritmi e della Calcolabilità Terza giornata: principali classi di complessità computazionale dei problemi Guido Proietti.
Esercizio ODBC. Configurare il driver ODBC Start  Control Panel  Administrative Tools Aprire: Data Source(ODBC) User DSN  Add…. Selezionare il driver.
Basi di dati distribuite Prof. M.T. PAZIENZA a.a
Gestione della Memoria
1 1. Introduzione alla gestione della memoria 2. Swapping 3. Memoria virtuale 4. Implementazione 5. Algoritmi di sostituzione Gestione della Memoria.
#sqlsatTorino #sqlsat400 May 23, 2015 Entity Framework 7 Back To The Future Nuove piattaforme, nuovi data store Michael about.me/micdenny.
Corso integrato di Matematica, Informatica e Statistica Informatica di base Linea 1 Daniela Besozzi Dipartimento di Informatica e Comunicazione Università.
Approfondimenti SQL.
Presenta – #wpc15it1 BI005 - Real Power BI Franco Perduca Factory Software srl
Elementi di statistica con R e i database LEZIONE 2 Rocco De Marco rocco.demarco(a)an.ismar.cnr.it Ancona, 12 Aprile 2012.
Linguaggio SQL. Linguaggi per database La diffusione del modello relazionale ha favorito l’uso prevalente di linguaggi non procedurali: in questo modo.
SQLite. Introduzione a SQLite Oltre alla possibilità di memorizzare informazioni persistenti attraverso Preferences e files, Android mette a disposizione.
Il linguaggio SQL (Structured Query Language) è il linguaggio standard per creare, manipolare e interrogare database relazionali. SQL non è case-sensitive:
Transcript della presentazione:

xVelocity in Deep Marco Pozzan twitter: @marcopozzan email: info@marcopozzan.it site: www.marcopozzan.it

Sponsors

Organizers

Speaker info MVP SQL Server Presidente della community 1nn0va (www.innovazionefvg.net) Business Intelligence consultant per Beantech (www.beantech.it) Docente ITS all’Università di Pordenone Partecipo agli eventi community

Agenda Gestione delle query Che cosa è xVelocity in-memory Row vs Columnar storage RLE e Dictionary Encoding Uso memoria: memorizzazione, processing e query Best practice

Gestione delle query Direct Query mode Trasformazione da DAX a SQL Query sul motore SQL Server Molte limitazioni (solo connessione SQL, solo DAX no MDX, limiti DAX, no colonne calcolate, no security) In Memory mode Engine per elaborare formule DAX (formula engine DAX) Storage Engine Vertipaq (xVelocity in-memory) Sfrutta tutte le funzionalità di Tabular

Gestione delle query PROCESS = Lettura dalla sorgente dati External Data Sources Analysis Services 2012 Tabular Model DirectQuery Mode (Motore di query) Query SQL Query DAX/MDX query Process Storage engine query In-Memory Mode (Motore di query) Vertipaq Storage Query Storage engine query Storage engine query PROCESS = Lettura dalla sorgente dati Vertipaq contiene il risultato del processing del database

Che cosa è xVelocity in-memory? E’ un database in memoria (dati sono in memoria) E’ basato su una metodologia relazionale Database colonnare

Come lavora un row storage Id FirstName LastName BirthDate Marital Status Children 1 Larry Gill 13/04/1977 00:00 M 2 Geoffrey Gonzalez 06/02/1977 00:00 S 3 Blake Collins 23/04/1975 00:00 4 Alexa Watson 25/08/1977 00:00 5 Jacquelyn Dominguez 27/09/1977 00:00 6 Casey Gutierrez 17/12/1977 00:00 7 Colleen Lu 17/07/1973 00:00 8 Jeremiah Stewart 26/06/1979 00:00 9 Leah Li 06/10/1976 00:00 Alloco spazio su disco (pagine) Id FirstName LastName BirthDate Marital Status Children 1 Larry Gill 13/04/1977 00:00 M 2 Geoffrey Gonzalez 06/02/1977 00:00 S 3 Blake Collins 23/04/1975 00:00 4 Alexa Watson 25/08/1977 00:00 5 Jacquelyn Dominguez 27/09/1977 00:00 M 1 6 Casey Gutierrez 17/12/1977 00:00 7 Colleen Lu 17/07/1973 00:00 2 8 Jeremiah Stewart 26/06/1979 00:00 S 9 Leah Li 06/10/1976 00:00 Alloco ancora spazio su disco perchè finito

Caratteristiche di un row storage SELECT * di una tabella Legge tutta la tabella dalla prima all’ultima riga SELECT SUM(children) della tabella Legge tutta la tabella dalla prima all’ultima riga e poi si legge solo la colonna children per fare la somma Prestazioni pessime per un dato piccolo devo fare tanto I/0 su disco che poi non serve

Caratteristiche di un row storage Il risultato della SELECT SUM(children) non cambia nemmeno se faccio I/O in memoria e non su disco Trasferisco i dati dalla memoria alla cache della CPU dove si svolge il calcolo La cache interna è molto limitata Pessimo uso perché carico una grande parte di memoria per poi usarne un pezzettino Ottengo comunque prestazioni peggiori rispetto al fatto di lavorare su dati più compatti (Problema)

Soluzione con gli indici Se devo fare spesso la SUM(children) Creo un indice su children La query richiede solo il campo children (l’indice copre la query), leggo solo l’indice e non tutta la tabella L’indice contiene dati più compatti e mi aiuta per I/O Gli indici in generale riducono il numero di colonne di una tabella e ottimizzano l’I/0 Concetto di Column Storage

Caratteristiche di un column storage Portiamo il concetto di indice in memoria Estremizziamo il concetto di indice Id 1 2 3 4 5 6 7 8 9 Id FirstName LastName BirthDate Marital Status Children 1 Larry Gill 13/04/1977 00:00 M 2 Geoffrey Gonzalez 06/02/1977 00:00 S 3 Blake Collins 23/04/1975 00:00 4 Alexa Watson 25/08/1977 00:00 5 Jacquelyn Dominguez 27/09/1977 00:00 6 Casey Gutierrez 17/12/1977 00:00 7 Colleen Lu 17/07/1973 00:00 8 Jeremiah Stewart 26/06/1979 00:00 9 Leah Li 06/10/1976 00:00 FirstName Larry Geoffrey Blake Alexa Jacquelyn Casey Colleen Jeremiah Leah LastName Gill Gonzalez Collins Watson Dominguez Gutierrez Lu Stewart Li BirthDate 13/04/1977 00:00 06/02/1977 00:00 23/04/1975 00:00 25/08/1977 00:00 27/09/1977 00:00 17/12/1977 00:00 17/07/1973 00:00 26/06/1979 00:00 06/10/1976 00:00 Marital Status M S Children 1 2 Un file per colonna

Caratteristiche di un column storage Faccio una SELECT SUM(children) della tabella Non devo fare un indice La colonna è già l’indice perché contiene solo children Molto veloce Faccio SELECT SUM(children) GROUP BY FirstName Non è più così bello Devo leggere due colonne: Children e FirstName Devo poi unire il risultato pagando tempo di CPU

Caratteristiche di un column storage Rispetto alla row storage più velocità se devo leggere una colonna più velocità se leggo poche colonne più lento se faccio SELECT *

Column vs Row Memorizzazione su colonna Accesso veloce ad una singola colonna Ho la necessità di materializzare le righe Spendiamo CPU per ridurre I/0 (le CPU le possono fare più veloci o metterne tante ) Memorizzazione per riga Accesso veloce alla singola riga Non necessita di materializzazione Spendiamo l’I/O per ridurre la CPU (i dischi o la memoria non si possono fare più veloci )

Cambiare il modo di pensare (colonnare) Siamo in un mondo in cui lo storage è fatto da una sola colonna . Ci sono cose che si possono fare memorizzando i dati in colonna che sono più efficienti rispetto ai dati memorizzati su riga Sapete come funziona la compressione di SQL Server? per riga (non fa grandi cose… pulizie spazi bianchi, ridurre caratteri unicode, ridurre i decimali …..) per pagina (identifica all’interno della pagina parti uguali e le indicizza per poi comprimere la pagina creando un indice all’inizio)

Compressione in Vertipaq Vertipaq (simile compressione di pagina in SQL Server) Identifica parti uguali nell’aria di memoria Crea una struttura per rappresentare le parti uguali e ottiene la struttura compressa della colonna Più efficiente di SQL perché si ragiona solo su una colonna con pochi valori distinti rispetto alla pagina di SQL in cui ho righe con più colonne e con meno valori distinti . Vediamo come Vertipaq esegue la compressione

Run Length Encoding (RLE) - 1 livello Children 1 ... 2 .... FirstName Larry ... Geoffrey Alexa Colleen BirthDate 13/04/1977 13/05/1977 13/06/1977 .... 15/04/1980 16/04/1947 13/04/1976 ... 13/04/1990 13/04/1934 BirthDate lunghezza 13/04/1977 1 13/05/1977 13/06/1977 .... 15/04/1980 16/04/1947 13/04/1976 ... 13/04/1990 13/04/1934 FirstName Lunghezza Larry 400 Geoffrey Alexa 100 Colleen Children Inizio Lunghezza 1 200 2 201 400 Le date cambiano così di frequente che se provassi a comprimerla avrei su lunghezza tutti 1 e otterrei una tabella più grande dell’originale Vertipaq lascia l’originale. Potrei anche decidere di togliere la colonna inizio e tenere solo la fine

Run Length Encoding (RLE) - 1 livello Vertipaq non usa mai più memoria rispetto alla colonna sorgente…se non riesce a comprimerla la lascia come è Vertipaq durante il processing di un tabella Divide la tabella in colonne Comprime ogni colonna con RLE Attenzione!!! L’ordinamento delle colonne deve essere lo stesso per ogni colonna perchè devo materializzare i dati delle varie colonne (se ne occupa vertipaq ) buon ordinamento = buona compressione

Dictionary encoding - 2 livello Più importante di RLE Vediamo i passi per creare il Dictionary Vertipaq legge una colonna di tipo stringa Effettua il distinct della colonna Ogni valore stringa è associato ad un numero in un Dictionary Sostituisco i valori stringa nella colonna con i numeri del Dictionary

Dictionary encoding - 2 livello xVelocity storage Quarter Q1 Q4 ... Q2 Q3 .... Quarter 1 ... 2 3 4 .... Creo il dizionario Quarter Count Lunghezza 1 400 2 3 800 100 4 900 RLE Indice Quarter 1 Q1 2 Q2 3 Q3 4 Q4 Indice Quarter 1 Q1 2 Q2 3 Q3 4 Q4 DISTINCT SOSTITUISCI Versione compressa Conoscendo i possibili valori della stringa utilizzo il numero minimo di bit per rappresentarla. In questo caso 4 possibili valori bastano 2 bit. Dizionario Con il dictionary encoding Vertipaq è datatyping independent. Non ha nessuna importanza il tipo dei campi che si utilizzano nelle viste per popolare il modello

Conclusioni su RLE e Dictionary encoding Una stringa nella tabella (osceno) dei fatti non ha più nessun prezzo grazie al dictionary encoding DOVETE vivere  pensando che Vertipaq memorizza i dati in questo modo. E’ fondamentale quando andrete a costruire un modello con Vertipaq Importa solo il numero di valori distinti delle colonne Tanti valori distinti occupano più spazio (+ RAM) ed più lungo fare analisi Pochi valori distinti occupano poco spazio (- RAM) e tutte operazioni ridotte

Conclusioni sulla compressione Dictionary Encoding Avviene quando è necessario: per una colonna con valori interi e con valori distinti molto alti conviene memorizzare il numero perché il dizionario sarebbe troppo grande Rende le tabelle datatype independent RLE Encoding Solo se i dati compressi sono più piccoli dell’originale Dipende fortemente dall’ordine dei dati SSAS sceglie il sorting migliore durante il process (10 s/milione di righe). Trovare stesso ordinamento per le colonne è difficile. Thomas Kejser: + 25% compressione con ordinamento sorgente

Conclusioni sulla compressione La compressione deriva dal fatto che abbiamo: Column Store Dictionary Encoding RLE Encoding Compressione: uso meno RAM e quindi più velocità e il modello riesce a stare nel server . Scansioni delle colonne sono più veloci Il valore di compressione che ci possiamo aspettare è…. Non lo sa nessuno ma la risposta commerciale è 10x anche si può arrivare a 50x o a 2x

Segmentation Fino ad ora abbiamo visto come Vertipaq processa e comprime una colonna Cosa succede con la tabella intera? In realtà Vertipaq non processa tutta la tabella prima di fare la compressione perché non avrebbe abbastanza memoria Si usa la tecnica della segmentation

Segmentation Ogni tabella è divisa in segmenti (dimensione variabile) 8 milioni di righe per ogni segmento in SSAS 1 milione di righe in PowerPivot C’è un dizionario globale per la tabella Bit-sizing (forma compatta del dizionario) è locale ad ogni segmento Ci sono delle DMV per avere informazione sui segmenti

Segmentation cycle Legge il segmento Genera o aggiorna il dizionario globale Genera un dizionario locale al segmento bit-sizing Comprime tutto e memorizza e passa al secondo segmento

Importanza della Segmentation Viene usata per lavorare su un insieme ridotto di dati per la compressione ( 1 o 8 millioni di righe) Viene usata come base per il parallelismo all’interno delle query Quando Vertipaq risolve una query usa un thread per ogni segmento della tabella (per fare la scansione) Se ho meno di 8 milioni userà un solo thread perché è antipoduttivo usarne di più Se ho 80 milioni di righe userà 10 thread su 10 core separati (ideale ma impensabile per conflitto sul bus)

Segmentation Fasi della segmentazione durante il processing Legge e crea i dizionari del segmento N Legge e crea i dizionari del segmento N + 1 Crea colonne calcolate, gerarchie, relazioni e tutte le strutture dati Comprime segmento N Comprime segmento N+1 Fine lettura dati del modello

Segmentation: caso speciale del 3 segmento Vertipaq cerca di ridurre il numero di segmenti da caricare fa un tentativo di leggere i primi due segmenti assieme (come fosse unico). Se ci sono 12 milioni di righe è inutile leggerli in due passi e legge direttamente 16 milioni di righe (primo segmento) altrimenti segmenta normalmente Legge e crea i dizionari del segmento 1 e 2 Legge e crea i dizionari del segmento 3 Crea colonne calcolate, gerarchie, relazioni e tutte le strutture dati Comprime segmento 1 Comprime segmento 3 Comprime segmento 2 Fine lettura dati del modello

Configurazione della segmentazione La configurazione e a livello di istanza DefaultSegmentRowCount (0 = default) ProcessingTimeboxSecPerMRow per decidere il tempo entro al quale deve ordinare

Uso memoria durante il processing Process data: carica, compressione, memorizzazione Process recalc: colonna calcolate, indici, relazioni, gerarchie Process Full: data + recalc Process transazionale Il vecchio cubo è tenuto in memoria e continua a rispondere Nuovi dai sono processati e alla fine si scambiano i cubi In totale un oggetto necessita di tre volte del suo spazio Memoria per tutti i dati 1x e memoria per il processing 2x Evitare di fare il process full o il process su singola tabella Eseguire il ProcessClear => attenzione a fare il backup

Uso memoria durante memorizzazione L’uso della memoria nella memorizzazione dipende da: Numero di colonne Cardinalità di ogni colonna (valori distinct) Tipo di dato (varia il dizionario) Numero di righe Non ci sono formule per calcolare lo spazio occupato da una tabella. L’unico modo è creare un prototipo!!! Attenzione ad avere un prototipo con dati veri  i dati nascosti sfalsano la distribuzione dei dati.

Uso memoria durante le query La cache richiede memoria Le query semplici richiedono un po’ di memoria Le query complesse richiedono molta memoria Fare spooling per valori temporanei Materializzare un dataset ( se faccio una query su più colonne alla fine devo unire i risultati ) Problema: in quanto molte volte può capitare che la versione materializzata sia più grande della tabella originale

Materialization Se vogliamo eseguire su un database colonnare la seguente query: Ci sono diverse tecniche ma agli estremi ci sono: Early Materialization Late Materializzation COD_Utente 345 1678 100 Tipo730 1 2 Cod_Ufficio 4555 2345 6545 444 num730 234 100 400 3 SELECT SUM(num730) AS N730,[COD_Ufficio] FROM [dbo].[Dichiarazioni730] WHERE [COD_Utente] = 345 AND [Tipo730] = 1 GROUP BY [COD_Ufficio]

Early materialization COD_Utente 345 1678 100 Tipo730 1 2 Cod_Ufficio 4555 2345 444 num730 234 100 400 3 SELECT SUM(num730) AS N730,[COD_Ufficio] FROM [dbo].[Dichiarazioni730] WHERE [COD_Utente] = 345 AND [Tipo730] = 1 GROUP BY [COD_Ufficio] La fregatura è che faccio tanto lavoro per comprimere in colonne separate e poi devo riunire tutto. Uso tanta memoria se faccio select * Ricomponiamo il row store (Materializzo) 345 1 4555 234 1678 2 2345 100 400 444 3 Proiezione per num730 e cod_ufficio 4555 234 400 Applico la where 345 1 4555 234 400 Sommo 4555 634

Late materialization COD_Utente 345 1678 100 COD_Utente 345 1678 100 Tipo730 1 2 Tipo730 1 2 Cod_Ufficio 4555 2345 444 num730 234 100 400 3 SELECT SUM(num730) AS N730,[COD_Ufficio] FROM [dbo].[Dichiarazioni730] WHERE [COD_Utente] = 345 AND [Tipo730] = 1 GROUP BY [COD_Ufficio] Applico la clausola where sulle due colonne separate Cod_Ufficio 4555 2345 6545 444 Cod_Ufficio 4555 Materializzo 4555 234 400 Applico la bitmap Bitmap 1 Bitmap 1 Bitmap 1 num730 234 100 400 3 num730 234 400 And Sommo 4555 634 Applico la bitmap

Quando avviene la materializzazione La materializzazione avviene per Join complessi La materializzazione avviene per iterazioni complesse Durante il salvataggio di dati temporanei Praticamente devo sempre materializzare

Quanto spazio uso per il mio modello? Nella directory dei dati, c’è un folder per ogni database ..\Microsoft SQL Server\MSAS11.MSSQLSERVER\OLAP\Data AdventureWorks Tabular Model SQL 2012....... Tipo di file ed estensioni Dictionary: .DICTIONARY Data: .IDF Index: .IDF (POS_TO_ID, ID_TO_POS) Relationship: GUID + .HDX Hierachies: .JDF

Quanto spazio uso per il mio modello? Ci sono anche delle DMV per estrarre le informazioni sullo stato del database di Tabular (ma sono complicate) Ritorna tutte le possibili DMV SELECT * FROM $SYSTEM.DISCOVER_SCHEMA_ROWSETS Ritorna la memoria utilizzata da tutti gli oggetti SELECT * FROM $SYSTEM.DISCOVER_OBJECT_MEMORY_USAGE Dettagli delle singole colonne SELECT * FROM $SYSTEM.DISCOVER_STORAGE_TABLE_COLUMNS Dettagli sui segmenti SELECT * FROM $SYSTEM.DISCOVER_STORAGE_TABLE_COLUMN_SEGMENTS

Quanto spazio uso per il mio modello? In alternativa alle DMV usate il PowerPivot di Kasper De Jonge. Si apre un foglio excel in cui da powerpivot interrogo le DMV su un istanza di analisys services http://www.powerpivotblog.nl/what-is-using-all-that-memory-on-my-analysis-server-instance/

Best Practice (ridurre i dictionary) Ridurre la lunghezza delle stringhe Ridurre il numero di valori distinti Dividere DateTime in due colonne (troppi valori distinti) Date Time Deve essere fissata una precisione per i valori floating point 76.201 diventa 76.2 Cercate di risolvere tutto a livello di sorgente dati e non in colonne calcolate (esempio con le viste)

Best Practice (ridurre dimensione tabelle) Evitare risultati parziali in colonne calcolate essi tendono ad avere molti valori distinti aumentano il numero di colonne Rimuovere le colonne non utilizzate

Best Practice per le junk dimensions Attenzione alle Junk Dimensions. Faccio la cross join della distinct di questi valori junk e li metto nella tabella junk e poi ci punto dentro con un intero Meglio + campi con pochi valori distinti sulla tabella dei fatti che uno che è il cross join dei valori distinti Se poi ho dimensioni con solo Id e descrizione è meglio memorizzare la descrizione nei fatti Descrizione occupa come l’Id nei fatti Non pago un join a query time Ho un tabella in meno da memorizzare che è inutile

Best Practice per le dimensioni degeneri Problema -> Memorizzare un ID per il DrillThrought nei report è costoso (sacco di valori distinti) Un solo valore per ogni riga un grande dizionario per grandi tabelle Soluzione -> Splittare in più colonne Tabella di 100 milioni di righe. N° di fattura che è dato da anno + progressivo. Lo divido in due o più colonne. Le colonne hanno un dizionario più piccolo. Se poi lo devo visualizzare sul report rimaterializzare lo faccio su un sottoinsieme di righe .

Workbook Optimizer esamina la composizione del modello di dati all'interno della vostra cartella di lavoro di PowerPivot http://www.microsoft.com/en-us/download/details.aspx?id=38793 vede se i dati in essa contenuti possono occupare meno spazio vede se possibile fare una migliore compressione Non è il massimo deve migliorare molto

Conclusioni su xVelocity Ha degli algoritmi di compressione molto efficienti Molto veloce sulle colonne singole L’accesso a più colonne richiede la materializzazione Metodo di memorizzazione diverso dai classici database Richiede un cambiamento di mentalità Tentate di pensare a colonne singole Tutte queste caratteristiche si riflettono in DAX.

DEMO Testiamo tutto quello fino a qui imparato su un caso reale di foglio excel bello grande.

Feedback form: http://speakerscore.com/8N8C #sqlsatPordenone #sqlsat367 Feedback form: http://speakerscore.com/8N8C Thanks!