Perfmon Vault: contatori Perfmon in SQL Server
Perfmon Vault è un mini-progetto work in progress che ho realizzato per importare contatori Perfmon (Windows e/o SQL Server) in SQL Server e conservarli a lungo termine per analisi storiche e trend.
Perché Ordered Columnstore?
Il progetto nasce come PoC per capire come sfruttare al meglio l’Ordered Clustered Columnstore Index, introdotto in SQL Server 2025.
Il problema di fondo con le versioni precedenti era duplice:
- da un lato l’esplosione dei dizionari per colonna, dovuta ai dati con alta cardinalità, come i nomi dei contatori, ma anche banalmente i valori stessi dei contatori, per cui i dizionari tendevano a gonfiarsi fino ad arrivare al limite di 16 MB, causando così un riempimento parziale dei rowgroup con un conseguente degrado della compressione e delle performance;
- dall’altro non essendo ordinato, ogni rebuild del Clustered Columnstore Index poteva produrre una distribuzione dei rowgroup diversa dalla precedente, rendendo difficile prevedere e stabilizzare le performance nel tempo.
L’ordine esplicito delle colonne permette di controllare come i dati vengono raggruppati nei rowgroup, riducendo la pressione sui dizionari e rendendo compressione e riempimento dei rowgroup più ripetibili e prevedibili.
Architettura (alto livello)
.BLG / .ZIP / .RAR files
│
▼
┌────────────┐ relog.exe (ODBC DSN) ┌────────────────────────────┐
│ PowerShell │──────────────────────► │ dbo.* synonyms │
│ import │ │ (relog expects dbo tables) │
│ script │ └──────────────┬─────────────┘
└────────────┘ │
▼
┌─────────────────────┐
│ [staging] schema │
│ CounterData │
│ CounterDetails │
│ DisplayToID │
└────────┬────────────┘
│
usp_LoadFromStaging
(MERGE + tier routing)
│
┌────────────────────┼────────────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Tier 1 │ │ Tier 2 │ │ Tier 3 │
│ HOT │ │ WARM │ │ COLD │
│ STANDARD │ │ STANDARD │ │ ARCHIVE │
│ CCI order│ │ CCI order│ │ CCI order│
│(DT, CID) │ │(DT, CID) │ │(CID, DT) │
└──────────┘ └──────────┘ └──────────┘
│ │ │
└────────────────────┼────────────────────┘
▼
┌──────────────────┐
│ vault.CounterData│ (unified view)
│ UNION ALL │
└──────────────────┘
Numeri del test case (1 server)
- ~5 anni di contatori registrati con granularità di 1 minuto
- ~3,6 miliardi di righe complessive in ~15GB
- Contatori per tier: ~55 (T1), ~600 (T2), ~2.000 (T3)
Note
- Progetto nato per un singolo server, ma può consolidare più server: crescendo, può diventare utile rivedere l’ordine delle colonne del columnstore per Tier 2 e Tier 3 (non per Tier 1, altri test sono in corso, vedere aggiornamenti repository).
- Il progetto è stato realizzato anche con assistenza IA come supporto allo sviluppo e alla documentazione del repository; è consigliata una review prima dell’uso.