Free PlyxSQL© SQL
POSTED , 13 LUG 2026
Free DOWNLOAD Clicca qui Info https://pgsoft.it/plyxhtml
Profilare le query in PlyxSQL: un componente VCL con grafico in tempo reale
Il problema: "perché questa query è lenta?"
Chiunque lavori con FireDAC su più database (Oracle, SQL Server, PostgreSQL, MySQL, SQLite…) prima o poi si scontra con la stessa domanda: quanto ci mette davvero questa query, e perché? Il monitor integrato di FireDAC c'è e funziona, ma è pensato per il debug estemporaneo, non per restare agganciato all'applicazione e mostrare l'informazione a chi sta lavorando sulla query in quel momento.
Nell'ambito di plyxSQL, il mio tool di gestione SQL scritto in C++Builder, ho quindi costruito un componente dedicato. Due, in realtà: uno che misura, uno che disegna. Tenerli separati è stata la decisione architetturale più importante di tutto il lavoro.
Due componenti, due responsabilità
TFDQueryProfiler è il motore: un TComponent non visuale che esegue una TFDQuery o una TFDStoredProc cronometrando il tempo con TStopwatch, registra le righe coinvolte e, se richiesto, recupera il piano di esecuzione nativo del driver. Nessuna intercettazione automatica delle query esistenti — lo richiami esplicitamente quando vuoi profilare qualcosa:
auto res = FDQueryProfiler1->ProfileOnActiveConnection(
L"SELECT * FROM Clienti WHERE Attivo=1");
ShowMessage(Format(L"%d ms, %d righe",
ARRAYOFCONST((res.ElapsedMs, res.RowsAffected))));La parte più interessante è il recupero del piano di esecuzione: non esiste una sintassi EXPLAIN universale, quindi il componente riconosce il dialetto della connessione e sceglie il comando giusto driver per driver:
| Driver | Comando |
|---|---|
| SQL Server | SET SHOWPLAN_ALL ON |
| PostgreSQL | EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) |
| MySQL | EXPLAIN FORMAT=JSON |
| SQLite | EXPLAIN QUERY PLAN |
| Oracle | EXPLAIN PLAN FOR + DBMS_XPLAN.DISPLAY() |
Per Firebird, InterBase, DB2, Informix e Access il componente ritorna semplicemente una stringa vuota invece di inventare una sintassi che potrebbe non esistere in quel dialetto. Meglio onesto che silenziosamente sbagliato.
Dal numero al disegno: TFDQueryProfilerChart
Il secondo componente, TFDQueryProfilerChart, è un TCustomControl che si aggancia all'evento OnProfileComplete del profiler e disegna tutto con GDI+: niente TeeChart, niente dipendenze esterne, solo Winapi.GDIPAPI e Winapi.GDIPOBJ, presenti in ogni edizione di RAD Studio.
Il collegamento tra i due componenti è una riga:
FDQueryProfilerChart1->Profiler = FDQueryProfiler1;Da quel momento, ogni chiamata a Profile(), ProfileSQL() o ProfileStoredProc() fa comparire una nuova barra animata nel grafico, con:
- Fascia KPI in alto — ultima esecuzione, media, min/max, totale query profilate;
- Barre colorate per soglia — verde/ambra/rosso in base a due soglie configurabili (
ThresholdWarningMs,ThresholdCriticalMs); - Animazione di crescita ease-out a 60fps quando arriva un nuovo dato;
- Tooltip on-hover con SQL troncato, tempo, righe e dialetto;
- Pannello di dettaglio on-click che mostra l'anteprima del piano di esecuzione.
Un dettaglio che fa la differenza: il colore ereditato
plyxSQL gestisce già più connessioni contemporaneamente in un TFDTreeExplorer, e ogni connessione ha un proprio colore identificativo nell'albero. Invece di inventare una palette scollegata, il profiler risolve il colore dello slot attivo e lo propaga al grafico:
TColor TFDQueryProfiler::ResolveConnColor(TFDConnection* AConn) const
{
if (!FTreeExplorer || !AConn) return clNone;
if (FTreeExplorer->ActiveConn() != AConn) return clNone;
TConnSlot* slot = FTreeExplorer->GetActiveSlot();
return slot ? slot->ConnColor : clNone;
}Risultato: bordo della barra selezionata, tooltip e pannello di dettaglio si intonano automaticamente al colore già assegnato a quella connessione nell'albero, con un fallback su un accento neutro quando il profiler non è collegato a nessun TFDTreeExplorer. Un piccolo dettaglio, ma è quello che fa sembrare un componente "parte dell'app" invece che un widget incollato sopra.
