1. Costo di ordinamento:
* Algoritmo: In genere, i database utilizzano un tipo di unione esterno. Questo perché le relazioni unite sono spesso troppo grandi per adattarsi alla memoria.
* Costo I/O (fattore dominante):
* L'ordinamento di unione esterno comporta più passaggi attraverso i dati.
* Numero di passaggi: Il numero di passaggi dipende dalla dimensione delle relazioni e dalla quantità di memoria disponibile (il "buffer"). Diciamo che abbiamo:
* `B` =numero di blocchi (pagine) nella relazione.
* `M` =Numero di blocchi di memoria disponibili (dimensione del buffer).
* Il numero di passaggi è approssimativamente `log_m (b)` o leggermente più di questo se si desidera essere estremamente accurato.
* I/O Costo per pass: Ogni pass legge e scrive l'intera relazione, quindi costa operazioni I/O 2B` (B per la lettura e B per la scrittura).
* Costo I/O totale per l'ordinamento: `2b * Numero di passaggi =2b * log_m (b)`. In modo più dettagliato, il costo di smistamento per ogni relazione `r` e` s` è:
* Ordine (r) =2 * `b (r)` * log m (`B (r)`) (dove `b (r)` è il numero di blocchi per la relazione r)
* Ordine (s) =2 * `b (s)` * log m (`B (s)`) (dove `b (s)` è il numero di blocchi per le relazioni s)
* Costo della CPU: Mentre l'ordinamento è principalmente legato all'I/O, esiste un costo della CPU associato al confronto delle tuple, unendo le corse ordinate, ecc. Questo costo è generalmente inferiore al costo dell'I/O e viene spesso ignorato in modelli di costo semplificati.
2. Costo di fusione:
* Costo I/O: Dopo aver ordinato le relazioni, la fase di fusione richiede la lettura di ogni blocco di entrambe le relazioni ordinate una volta.
* `B (r) + b (s)` (dove `b (r)` e `b (s)` sono il numero di blocchi per le relazioni r e s, rispettivamente)
* Costo della CPU: Il costo della CPU per il confronto delle tuple durante la fase di unione è relativamente piccolo rispetto ai costi di smistamento e I/O.
Costo totale:
Il costo totale del jerge di ordinamento è all'incirca la somma dei costi di smistamento e del costo di fusione:
Costo ≈ 2 * b (r) * log m (B (r)) + 2 * b (s) * log m (B (s)) + b (r) + b (s)
Costo semplificato (approssimazione comune):
Se il costo di ordinamento domina (che di solito è il caso), un'approssimazione semplificata è:
Costo ≈ 2 * b (r) * log m (B (r)) + 2 * b (s) * log m (B (s))
Considerazioni importanti:
* Memoria (M): La quantità di memoria disponibile influisce in modo significativo sul numero di passaggi richiesti per l'ordinamento. Più memoria significa meno passaggi e costi inferiori.
* Dati pre-ordinati: Se una delle due relazioni è * già * ordinata sulla chiave di join, è possibile saltare il passaggio di ordinamento per quella relazione. Ciò riduce drasticamente il costo. Il costo diventa il costo di smistamento solo della relazione non cortiosa più il costo di fusione.
* Duplicati: Se le chiavi di join contengono duplicati, la fase di unione può essere più complessa, potenzialmente richiedendo I/O e CPU aggiuntivi. La formula presuppone che la gestione duplicata sia incorporata all'interno di ciascuna lettura di un blocco.
* Dimensione del blocco: La dimensione del blocco (dimensione della pagina) influisce sul numero di blocchi in una relazione.
* Modello di costo: La formula esatta utilizzata per la stima dei costi varia tra i sistemi di database. Alcuni possono includere costi di CPU in modo più esplicito, tempi di ricerca del disco, ecc. Questo è un modello semplificato per comprendere i costi relativi.
* hash join vs. ordin-merge join: In molti casi, Hash Join è più efficiente di Ordin-Merge Join, specialmente quando una delle relazioni si adatta interamente in memoria. Tuttavia, il join Sort-Merge può essere più efficiente quando i dati sono già ordinati o quando i dati non si partiranno uniformemente.
* Approcci ibridi: Alcuni database utilizzano approcci ibridi che combinano aspetti di Hash Join e Ordy-Merge Join.
* Prestazioni effettive: Questi sono costi teorici. Le prestazioni effettive possono essere influenzate da fattori come le prestazioni I/O del disco, la velocità della CPU, la concorrenza e la messa a punto del database.
Esempio:
Diciamo:
* `B (r) =1000` blocchi
* `B (s) =500` blocchi
* `M =100` blocchi di memoria
Poi:
* log 100 (1000) ≈ 1,5
* log 100 (500) ≈ 1.35
Costo stimato ≈ 2 * 1000 * 1,5 + 2 * 500 * 1,35 + 1000 + 500
≈ 3000 + 1350 + 1500
≈ 5850 operazioni I/O.
Questa è solo una stima e il costo effettivo in un sistema di database reale potrebbe essere diverso. Il confronto relativo è che il costo di smistamento è superiore al costo di fusione.
In sintesi, il costo di Ordin-Merge Join è dominato dal costo I/O di ordinare le relazioni. Il numero di passaggi richiesti per l'ordinamento dipende dalle dimensioni delle relazioni e dalla quantità di memoria disponibile. Ridurre le dimensioni delle relazioni (ad esempio, attraverso il filtraggio o la proiezione) o aumentare la memoria disponibile può migliorare significativamente le prestazioni.
software © www.354353.com