Ordinare i dati: Sort
L’azione di sort dei dati non e un operatore dell’algebra ma risulta molto utile per risolvere alcune situazioni tra cui query ORDER BY
, bulk loading degli indici e operatori di JOIN
e GROUP BY
.
Gli algoritmi di sort possono essere suddivisi in base alla memoria in cui vengono svolti:
algoritmi di sort interni | algoritmi di sort esterni |
---|---|
eseguiti in memoria centrale, con prestazioni molto buone | eseguiti usando la memoria secondaria di appoggio |
Merge sort esterno
Il concetto alla base di questo sistema di sorting e caricare i dati in memoria centrale in sequenze (dette run), ordinarle con un merge interno e poi eseguire il merge una per volta
flowchart LR A[(pages in datafile)] subgraph internal memory B((internal sort)) C[run] D[run] F((merge)) end A --> B --> C -->F B --> D <--> F
il primo passo di ordinamento utilizza un sort interno
Nella fase di fusione vengono usati 3 buffer (uno per l’output) dove vengono caricati in input le pagine delle run e mergiate nella pagina di output
Merge sort esterno: performance
dato un numero di pagine in input il numero di passi dell’algoritmo di sort merge e con un costo totale (in numero di letture scritture) . Con e tempo di I/O si ha un costo di minuti
direi non il massimo…
Migliorando il sort merge: sort merge a z vie
Un possibile miglioramento consiste nell’utilizzare buffers (uno sempre per l’output) nella fase di merge, aumentando il fan-in della fase di merge
--- title: z-vie sort merge --- flowchart TD A[leggi z run dal disco] B[fondi le run sul buffer di output] C[scrivi il buffer di output sul disco] A --> B --> C -- ripeti per finio a che non resta una sola run --> A
Determinare il valore di
La scelta piu immediata per determinare il valore di sarebbe farlo piu grande possibile cosi da massimizzarne il vantaggio, tuttavia questo a 2 limitazioni principali:
- consumo di CPU, in quanto il costo di determinare il maggiore fra elementi segue
- non vi e distinzione tra letture random e sequenziali del disco
Distinguendo tra i due tipi di letture si ha che:
Di conseguenza si possono organizzare le letture delle pagine in batches detti -frame da pagine ciascuno
Sorting con b+tree
Nel caso di ordinamento con b+tree e necessario distinguere tra le tipologie di indice
- se l’indice e clustered il costo e dato dal numero di foglie e di pagine del file dati (costo )
- se l’indice e un-clustered ogni record causa l’accesso al file dati (costo ), se gli attributi interessanti sono contenuti nell’indice si può evitare di accedere al file dati (costo )