Skip to content

Commit 8837099

Browse files
0xgoudapashagolub
andauthored
[-] fix panel queries in Table Details dashboard (#1150)
* Fix sql queries * fix sql query for `Last VACUUM/ANALYZE` panels * Improve sql queries for panels that use `lag()` * remove comments from queries Co-authored-by: Pavlo Golub <pavlo.golub@gmail.com> --------- Co-authored-by: Pavlo Golub <pavlo.golub@gmail.com>
1 parent b3b453a commit 8837099

1 file changed

Lines changed: 18 additions & 18 deletions

File tree

grafana/postgres/v12/5-table-details.json

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"editable": true,
1919
"fiscalYearStartMonth": 0,
2020
"graphTooltip": 0,
21-
"id": 30,
21+
"id": 9,
2222
"links": [],
2323
"panels": [
2424
{
@@ -120,7 +120,7 @@
120120
"sort": "desc"
121121
}
122122
},
123-
"pluginVersion": "12.1.0",
123+
"pluginVersion": "12.3.1",
124124
"targets": [
125125
{
126126
"alias": "total_relation_size",
@@ -311,7 +311,7 @@
311311
"sort": "desc"
312312
}
313313
},
314-
"pluginVersion": "12.1.0",
314+
"pluginVersion": "12.3.1",
315315
"targets": [
316316
{
317317
"alias": "seq_scans",
@@ -340,7 +340,7 @@
340340
"orderByTime": "ASC",
341341
"policy": "default",
342342
"rawQuery": true,
343-
"rawSql": "SELECT\n $__timeGroup(time, $agg_interval),\n avg( ((seq_scan-seq_scan_lag)::numeric*3600) / extract(epoch from time - time_lag) ) as seq_scan,\n avg( ((idx_scan-idx_scan_lag)::numeric*3600) / extract(epoch from time - time_lag) ) as idx_scan\nFROM ( \n SELECT\n (data->>'seq_scan')::int8 as seq_scan, lag((data->>'seq_scan')::int8) over w as seq_scan_lag,\n (data->>'idx_scan')::int8 as idx_scan, lag((data->>'idx_scan')::int8) over w as idx_scan_lag,\n time, lag(time) over w as time_lag \n FROM\n table_stats\n WHERE\n $__timeFilter(time) AND dbname = '$dbname'\n AND tag_data @> jsonb_build_object('table_full_name', '$table_full_name')\n WINDOW w as (order by time)\n) x\nWHERE seq_scan >= seq_scan_lag and time > time_lag\nGROUP BY 1\nORDER BY 1",
343+
"rawSql": "WITH last_out_of_range_row_time(time) AS (\n SELECT time \n FROM table_stats\n WHERE dbname = '$dbname' AND time < $__timeFrom()::timestamptz\n ORDER BY time DESC\n LIMIT 1\n)\n\nSELECT\n $__timeGroup(time, $agg_interval),\n avg( ((seq_scan-seq_scan_lag)::numeric*3600) / extract(epoch from time - time_lag) ) as seq_scan,\n avg( ((idx_scan-idx_scan_lag)::numeric*3600) / extract(epoch from time - time_lag) ) as idx_scan\nFROM ( \n SELECT\n (data->>'seq_scan')::int8 as seq_scan, lag((data->>'seq_scan')::int8) over w as seq_scan_lag,\n (data->>'idx_scan')::int8 as idx_scan, lag((data->>'idx_scan')::int8) over w as idx_scan_lag,\n time, lag(time) over w as time_lag \n FROM\n table_stats\n WHERE \n time <= $__timeTo()::timestamptz AND time >= (SELECT time FROM last_out_of_range_row_time)\n AND dbname = '$dbname' AND tag_data @> jsonb_build_object('table_full_name', '$table_full_name')\n WINDOW w as (order by time)\n) x\nWHERE seq_scan >= seq_scan_lag and time > time_lag\nGROUP BY 1\nORDER BY 1",
344344
"refId": "A",
345345
"resultFormat": "time_series",
346346
"select": [
@@ -476,7 +476,7 @@
476476
"sort": "desc"
477477
}
478478
},
479-
"pluginVersion": "12.1.0",
479+
"pluginVersion": "12.3.1",
480480
"targets": [
481481
{
482482
"alias": "INS",
@@ -505,7 +505,7 @@
505505
"orderByTime": "ASC",
506506
"policy": "default",
507507
"rawQuery": true,
508-
"rawSql": "select\n $__timeGroup(time, $agg_interval),\n avg((ins-ins_lag) * 3600 / extract(epoch from time - time_lag)) as \"INSERT\",\n avg((upd-upd_lag) * 3600 / extract(epoch from time - time_lag)) as \"UPDATE\",\n avg((del-del_lag) * 3600 / extract(epoch from time - time_lag)) as \"DELETE\"\nfrom (\n select \n (data->>'n_tup_ins')::int8 as ins, lag((data->>'n_tup_ins')::int8) over w as ins_lag,\n (data->>'n_tup_upd')::int8 as upd, lag((data->>'n_tup_upd')::int8) over w as upd_lag,\n (data->>'n_tup_del')::int8 as del, lag((data->>'n_tup_del')::int8) over w as del_lag,\n time, lag(time) over w as time_lag\n from table_stats\n where dbname = '$dbname' and $__timeFilter(time)\n and tag_data @> jsonb_build_object('table_full_name', '$table_full_name')\n window w as (order by time)\n\n) x\nwhere ins >= ins_lag and time > time_lag\ngroup by 1\norder by 1",
508+
"rawSql": "WITH last_out_of_range_row_time(time) AS (\n SELECT time \n FROM table_stats\n WHERE dbname = '$dbname' AND time < $__timeFrom()::timestamptz\n ORDER BY time DESC\n LIMIT 1\n)\n\nselect\n $__timeGroup(time, $agg_interval),\n avg((ins-ins_lag) * 3600 / extract(epoch from time - time_lag)) as \"INSERT\",\n avg((upd-upd_lag) * 3600 / extract(epoch from time - time_lag)) as \"UPDATE\",\n avg((del-del_lag) * 3600 / extract(epoch from time - time_lag)) as \"DELETE\"\nfrom (\n select \n (data->>'n_tup_ins')::int8 as ins, lag((data->>'n_tup_ins')::int8) over w as ins_lag,\n (data->>'n_tup_upd')::int8 as upd, lag((data->>'n_tup_upd')::int8) over w as upd_lag,\n (data->>'n_tup_del')::int8 as del, lag((data->>'n_tup_del')::int8) over w as del_lag,\n time, lag(time) over w as time_lag\n from table_stats\n where \n time <= $__timeTo()::timestamptz AND time >= (SELECT time FROM last_out_of_range_row_time)\n AND dbname = '$dbname' and tag_data @> jsonb_build_object('table_full_name', '$table_full_name')\n window w as (order by time)\n) x\nwhere ins >= ins_lag and time > time_lag\ngroup by 1\norder by 1",
509509
"refId": "A",
510510
"resultFormat": "time_series",
511511
"select": [
@@ -641,7 +641,7 @@
641641
"sort": "desc"
642642
}
643643
},
644-
"pluginVersion": "12.1.0",
644+
"pluginVersion": "12.3.1",
645645
"targets": [
646646
{
647647
"alias": "Heap",
@@ -671,7 +671,7 @@
671671
"policy": "default",
672672
"query": "SELECT non_negative_derivative(mean(\"heap_blks_hit\"), 10s) / (non_negative_derivative(mean(\"heap_blks_hit\"), 10s) + non_negative_derivative(mean(\"heap_blks_read\"), 10s)) * 100 FROM \"table_io_stats\" WHERE \"dbname\" =~ /^$dbname$/ AND \"table_full_name\" =~ /^$table_full_name$/ AND $timeFilter GROUP BY time($__interval) fill(none)",
673673
"rawQuery": true,
674-
"rawSql": "select\n $__timeGroup(time, $agg_interval),\n avg( case when hh = hh_lag and hr = hr_lag then null else (hh-hh_lag)::numeric * 100 / (hh-hh_lag+hr-hr_lag) end ) as \"Heap\",\n avg( case when ih = ih_lag and ir = ir_lag then null else (ih-ih_lag)::numeric * 100 / (ih-ih_lag+ir-ir_lag) end ) as \"Indexes\" \nfrom (\n select \n (data->>'heap_blks_hit')::int8 as hh, lag((data->>'heap_blks_hit')::int8) over w as hh_lag,\n (data->>'heap_blks_read')::int8 as hr, lag((data->>'heap_blks_read')::int8) over w as hr_lag,\n (data->>'idx_blks_hit')::int8 as ih, lag((data->>'idx_blks_hit')::int8) over w as ih_lag,\n (data->>'idx_blks_read')::int8 as ir, lag((data->>'idx_blks_read')::int8) over w as ir_lag,\n time\n from table_io_stats\n where dbname = '$dbname' and $__timeFilter(time)\n and tag_data @> jsonb_build_object('table_full_name', '$table_full_name')\n window w as (order by time)\n) x\nwhere hh >= hh_lag\ngroup by 1\norder by 1",
674+
"rawSql": "WITH last_out_of_range_row_time(time) AS (\n SELECT time \n FROM table_io_stats\n WHERE dbname = '$dbname' AND time < $__timeFrom()::timestamptz\n ORDER BY time DESC\n LIMIT 1\n)\n\nselect\n $__timeGroup(time, $agg_interval),\n avg( case when hh = hh_lag and hr = hr_lag then null else (hh-hh_lag)::numeric * 100 / (hh-hh_lag+hr-hr_lag) end ) as \"Heap\",\n avg( case when ih = ih_lag and ir = ir_lag then null else (ih-ih_lag)::numeric * 100 / (ih-ih_lag+ir-ir_lag) end ) as \"Indexes\" \nfrom (\n select \n (data->>'heap_blks_hit')::int8 as hh, lag((data->>'heap_blks_hit')::int8) over w as hh_lag,\n (data->>'heap_blks_read')::int8 as hr, lag((data->>'heap_blks_read')::int8) over w as hr_lag,\n (data->>'idx_blks_hit')::int8 as ih, lag((data->>'idx_blks_hit')::int8) over w as ih_lag,\n (data->>'idx_blks_read')::int8 as ir, lag((data->>'idx_blks_read')::int8) over w as ir_lag,\n time\n from table_io_stats\n where\n time <= $__timeTo()::timestamptz AND time >= (SELECT time FROM last_out_of_range_row_time)\n AND dbname = '$dbname' and tag_data @> jsonb_build_object('table_full_name', '$table_full_name')\n window w as (order by time)\n) x\nwhere hh >= hh_lag\ngroup by 1\norder by 1",
675675
"refId": "A",
676676
"resultFormat": "time_series",
677677
"select": [
@@ -805,7 +805,7 @@
805805
"sort": "desc"
806806
}
807807
},
808-
"pluginVersion": "12.1.0",
808+
"pluginVersion": "12.3.1",
809809
"targets": [
810810
{
811811
"alias": "$tag_index_name",
@@ -840,7 +840,7 @@
840840
"orderByTime": "ASC",
841841
"policy": "default",
842842
"rawQuery": true,
843-
"rawSql": "select\n $__timeGroup(time, $agg_interval),\n index_name,\n avg( ((idx_scan - idx_scan_lag)::numeric * 3600) / extract(epoch from time - time_lag) )\nfrom (\n select \n (data->>'idx_scan')::int8 as idx_scan, lag((data->>'idx_scan')::int8) over w as idx_scan_lag,\n tag_data->>'index_name' as index_name,\n time, lag(time) over w as time_lag\n from index_stats\n where dbname = '$dbname' and $__timeFilter(time)\n and tag_data @> jsonb_build_object('table_full_name', '$table_full_name')\n window w as (order by time)\n) x\nwhere idx_scan >= idx_scan_lag and time > time_lag\ngroup by 1, 2\norder by 1, 2",
843+
"rawSql": "WITH last_out_of_range_row_time(time) AS (\n SELECT time \n FROM index_stats\n WHERE dbname = '$dbname' AND time < $__timeFrom()::timestamptz\n ORDER BY time DESC\n LIMIT 1\n)\n\nselect\n $__timeGroup(time, $agg_interval),\n index_name,\n avg( ((idx_scan - idx_scan_lag)::numeric * 3600) / extract(epoch from time - time_lag) )\nfrom (\n select \n (data->>'idx_scan')::int8 as idx_scan, lag((data->>'idx_scan')::int8) over w as idx_scan_lag,\n tag_data->>'index_name' as index_name,\n time, lag(time) over w as time_lag\n from index_stats\n where\n time <= $__timeTo()::timestamptz AND time >= (SELECT time FROM last_out_of_range_row_time)\n AND dbname = '$dbname' and tag_data @> jsonb_build_object('table_full_name', '$table_full_name')\n window w as (order by time)\n) x\nwhere idx_scan >= idx_scan_lag and time > time_lag\ngroup by 1, 2\norder by 1, 2",
844844
"refId": "A",
845845
"resultFormat": "time_series",
846846
"select": [
@@ -951,7 +951,7 @@
951951
"textMode": "auto",
952952
"wideLayout": true
953953
},
954-
"pluginVersion": "12.1.0",
954+
"pluginVersion": "12.3.1",
955955
"targets": [
956956
{
957957
"datasource": {
@@ -962,7 +962,7 @@
962962
"group": [],
963963
"metricColumn": "none",
964964
"rawQuery": true,
965-
"rawSql": "SELECT\n 0 as time,\n (data->>'seconds_since_last_vacuum')::int8\nFROM\n table_stats\nWHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\n AND tag_data @> jsonb_build_object('table_full_name', '$table_full_name')\nORDER BY time DESC\nLIMIT 1\n",
965+
"rawSql": "SELECT\n time,\n (data->>'seconds_since_last_vacuum')::int8\nFROM\n table_stats\nWHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\n AND tag_data @> jsonb_build_object('table_full_name', '$table_full_name')\nORDER BY time DESC\nLIMIT 1\n",
966966
"refId": "A",
967967
"select": [
968968
[
@@ -1055,7 +1055,7 @@
10551055
"textMode": "auto",
10561056
"wideLayout": true
10571057
},
1058-
"pluginVersion": "12.1.0",
1058+
"pluginVersion": "12.3.1",
10591059
"targets": [
10601060
{
10611061
"datasource": {
@@ -1066,7 +1066,7 @@
10661066
"group": [],
10671067
"metricColumn": "none",
10681068
"rawQuery": true,
1069-
"rawSql": "SELECT\n 0 as time,\n (data->>'seconds_since_last_analyze')::int8\nFROM\n table_stats\nWHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\n AND tag_data @> jsonb_build_object('table_full_name', '$table_full_name')\nORDER BY time DESC\nLIMIT 1\n",
1069+
"rawSql": "SELECT\n time,\n (data->>'seconds_since_last_analyze')::int8\nFROM\n table_stats\nWHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\n AND tag_data @> jsonb_build_object('table_full_name', '$table_full_name')\nORDER BY time DESC\nLIMIT 1\n",
10701070
"refId": "A",
10711071
"select": [
10721072
[
@@ -2627,7 +2627,7 @@
26272627
"overrides": []
26282628
},
26292629
"gridPos": {
2630-
"h": 5,
2630+
"h": 6,
26312631
"w": 12,
26322632
"x": 0,
26332633
"y": 30
@@ -2642,15 +2642,15 @@
26422642
"content": "### Brought to you by\n\n[![Cybertec – The PostgreSQL Database Company](https://www.cybertec-postgresql.com/wp-content/uploads/2025/02/cybertec-logo-white-blue.svg)](https://www.cybertec-postgresql.com/en/)\n",
26432643
"mode": "markdown"
26442644
},
2645-
"pluginVersion": "12.1.0",
2645+
"pluginVersion": "12.3.1",
26462646
"title": "",
26472647
"transparent": true,
26482648
"type": "text"
26492649
}
26502650
],
26512651
"preload": false,
26522652
"refresh": "",
2653-
"schemaVersion": 41,
2653+
"schemaVersion": 42,
26542654
"tags": [
26552655
"pgwatch"
26562656
],
@@ -2810,5 +2810,5 @@
28102810
"timezone": "browser",
28112811
"title": "5. Table Details",
28122812
"uid": "table-details",
2813-
"version": 33
2813+
"version": 34
28142814
}

0 commit comments

Comments
 (0)