From 6cc5826a96b8fba66ee5f17582fe09cb213c008e Mon Sep 17 00:00:00 2001 From: Erik Darling <2136037+erikdarlingdata@users.noreply.github.com> Date: Sun, 22 Feb 2026 19:48:01 -0500 Subject: [PATCH 1/9] Add native graphical query plan viewer to Dashboard and Lite (#220) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 1: ShowPlanXML rendering as interactive operator graph in a new Plan Viewer tab. Right-click any query row → View Estimated Plan to parse and display the plan inline (fetches on-demand when needed). - LINQ-to-XML parser with cost computation, warnings, missing indexes - SSMS-style layout: left-to-right with first-child horizontal spine - 113 MIT-licensed operator icons from vscode-mssql - Synthetic SELECT/INSERT/UPDATE/DELETE root node - Rich tooltips, zoom/pan, save .sqlplan, multi-statement selector - Missing index banner with CREATE INDEX suggestions - Warnings banner (spills, implicit conversions, no join predicate) - View Actual Plan menu item stubbed for Phase 2 (query execution) Tested on sql2022 with TPC-H plans. Both apps build clean. Co-Authored-By: Claude Opus 4.6 --- Dashboard/Controls/PlanViewerControl.xaml | 100 ++++ Dashboard/Controls/PlanViewerControl.xaml.cs | 546 ++++++++++++++++++ .../Controls/QueryPerformanceContent.xaml | 3 + .../Controls/QueryPerformanceContent.xaml.cs | 51 ++ Dashboard/Dashboard.csproj | 1 + Dashboard/Models/PlanModels.cs | 129 +++++ .../Resources/PlanIcons/adaptive_join.png | Bin 0 -> 2148 bytes Dashboard/Resources/PlanIcons/aggregate.png | Bin 0 -> 2035 bytes Dashboard/Resources/PlanIcons/apply.png | Bin 0 -> 1184 bytes .../PlanIcons/arithmetic_expression.png | Bin 0 -> 2644 bytes Dashboard/Resources/PlanIcons/assert.png | Bin 0 -> 867 bytes Dashboard/Resources/PlanIcons/assign.png | Bin 0 -> 2615 bytes .../PlanIcons/batch_hash_table_build.png | Bin 0 -> 1386 bytes Dashboard/Resources/PlanIcons/bitmap.png | Bin 0 -> 1885 bytes .../Resources/PlanIcons/bookmark_lookup.png | Bin 0 -> 1632 bytes Dashboard/Resources/PlanIcons/broadcast.png | Bin 0 -> 2409 bytes .../PlanIcons/clustered_index_delete.png | Bin 0 -> 3038 bytes .../PlanIcons/clustered_index_insert.png | Bin 0 -> 2928 bytes .../PlanIcons/clustered_index_merge.png | Bin 0 -> 3231 bytes .../PlanIcons/clustered_index_scan.png | Bin 0 -> 2838 bytes .../PlanIcons/clustered_index_seek.png | Bin 0 -> 4774 bytes .../PlanIcons/clustered_index_update.png | Bin 0 -> 3381 bytes .../Resources/PlanIcons/clustered_update.png | Bin 0 -> 3902 bytes Dashboard/Resources/PlanIcons/collapse.png | Bin 0 -> 1449 bytes .../PlanIcons/columnstore_index_delete.png | Bin 0 -> 1441 bytes .../PlanIcons/columnstore_index_insert.png | Bin 0 -> 1623 bytes .../PlanIcons/columnstore_index_merge.png | Bin 0 -> 2970 bytes .../PlanIcons/columnstore_index_scan.png | Bin 0 -> 1298 bytes .../PlanIcons/columnstore_index_update.png | Bin 0 -> 1812 bytes .../Resources/PlanIcons/compute_scalar.png | Bin 0 -> 1106 bytes .../PlanIcons/compute_to_control_node.png | Bin 0 -> 1946 bytes .../Resources/PlanIcons/concatenation.png | Bin 0 -> 908 bytes .../Resources/PlanIcons/const_table_get.png | Bin 0 -> 1327 bytes .../Resources/PlanIcons/constant_scan.png | Bin 0 -> 1114 bytes .../PlanIcons/control_to_compute_nodes.png | Bin 0 -> 1992 bytes Dashboard/Resources/PlanIcons/convert.png | Bin 0 -> 2932 bytes .../Resources/PlanIcons/cursor_catch_all.png | Bin 0 -> 1865 bytes Dashboard/Resources/PlanIcons/declare.png | Bin 0 -> 1981 bytes Dashboard/Resources/PlanIcons/delete.png | Bin 0 -> 1601 bytes .../Resources/PlanIcons/deleted_scan.png | Bin 0 -> 1644 bytes Dashboard/Resources/PlanIcons/dynamic.png | Bin 0 -> 1459 bytes .../PlanIcons/external_broadcast.png | Bin 0 -> 2538 bytes .../Resources/PlanIcons/external_export.png | Bin 0 -> 1707 bytes .../PlanIcons/external_local_streaming.png | Bin 0 -> 1353 bytes .../PlanIcons/external_round_robin.png | Bin 0 -> 1965 bytes .../Resources/PlanIcons/external_shuffle.png | Bin 0 -> 2564 bytes Dashboard/Resources/PlanIcons/fetch_query.png | Bin 0 -> 1472 bytes Dashboard/Resources/PlanIcons/filter.png | Bin 0 -> 980 bytes .../foreign_key_references_check.png | Bin 0 -> 1465 bytes Dashboard/Resources/PlanIcons/get.png | Bin 0 -> 1313 bytes .../PlanIcons/group_by_aggregate.png | Bin 0 -> 1615 bytes Dashboard/Resources/PlanIcons/hash_match.png | Bin 0 -> 1235 bytes .../Resources/PlanIcons/hash_match_root.png | Bin 0 -> 1308 bytes .../Resources/PlanIcons/hash_match_team.png | Bin 0 -> 1342 bytes Dashboard/Resources/PlanIcons/if.png | Bin 0 -> 4548 bytes .../Resources/PlanIcons/index_delete.png | Bin 0 -> 2292 bytes .../Resources/PlanIcons/index_insert.png | Bin 0 -> 2138 bytes Dashboard/Resources/PlanIcons/index_scan.png | Bin 0 -> 2188 bytes Dashboard/Resources/PlanIcons/index_seek.png | Bin 0 -> 3583 bytes Dashboard/Resources/PlanIcons/index_spool.png | Bin 0 -> 2675 bytes .../Resources/PlanIcons/index_update.png | Bin 0 -> 2595 bytes Dashboard/Resources/PlanIcons/insert.png | Bin 0 -> 966 bytes .../Resources/PlanIcons/inserted_scan.png | Bin 0 -> 1440 bytes Dashboard/Resources/PlanIcons/intrinsic.png | Bin 0 -> 1973 bytes .../PlanIcons/iterator_catch_all.png | Bin 0 -> 843 bytes Dashboard/Resources/PlanIcons/join.png | Bin 0 -> 1124 bytes Dashboard/Resources/PlanIcons/keyset.png | Bin 0 -> 3930 bytes .../language_construct_catch_all.png | Bin 0 -> 1880 bytes Dashboard/Resources/PlanIcons/locate.png | Bin 0 -> 2686 bytes .../Resources/PlanIcons/log_row_scan.png | Bin 0 -> 1240 bytes .../Resources/PlanIcons/merge_interval.png | Bin 0 -> 1638 bytes Dashboard/Resources/PlanIcons/merge_join.png | Bin 0 -> 1608 bytes .../Resources/PlanIcons/nested_loops.png | Bin 0 -> 1419 bytes Dashboard/Resources/PlanIcons/parallelism.png | Bin 0 -> 1558 bytes .../PlanIcons/parameter_table_scan.png | Bin 0 -> 1094 bytes .../Resources/PlanIcons/population_query.png | Bin 0 -> 1417 bytes Dashboard/Resources/PlanIcons/predict.png | Bin 0 -> 5193 bytes Dashboard/Resources/PlanIcons/print.png | Bin 0 -> 2077 bytes Dashboard/Resources/PlanIcons/project.png | Bin 0 -> 783 bytes Dashboard/Resources/PlanIcons/rank.png | Bin 0 -> 1475 bytes .../Resources/PlanIcons/refresh_query.png | Bin 0 -> 1873 bytes .../Resources/PlanIcons/remote_delete.png | Bin 0 -> 1405 bytes .../Resources/PlanIcons/remote_index_scan.png | Bin 0 -> 2242 bytes .../Resources/PlanIcons/remote_index_seek.png | Bin 0 -> 2103 bytes .../Resources/PlanIcons/remote_insert.png | Bin 0 -> 1299 bytes .../Resources/PlanIcons/remote_query.png | Bin 0 -> 1122 bytes Dashboard/Resources/PlanIcons/remote_scan.png | Bin 0 -> 1333 bytes .../Resources/PlanIcons/remote_update.png | Bin 0 -> 1755 bytes Dashboard/Resources/PlanIcons/result.png | Bin 0 -> 908 bytes Dashboard/Resources/PlanIcons/rid_lookup.png | Bin 0 -> 3250 bytes .../Resources/PlanIcons/row_count_spool.png | Bin 0 -> 1663 bytes Dashboard/Resources/PlanIcons/segment.png | Bin 0 -> 897 bytes Dashboard/Resources/PlanIcons/sequence.png | Bin 0 -> 995 bytes .../Resources/PlanIcons/sequence_project.png | Bin 0 -> 1328 bytes .../Resources/PlanIcons/set_function.png | Bin 0 -> 3064 bytes Dashboard/Resources/PlanIcons/shuffle.png | Bin 0 -> 2415 bytes .../PlanIcons/single_source_round_robin.png | Bin 0 -> 1820 bytes .../PlanIcons/single_source_shuffle.png | Bin 0 -> 1822 bytes Dashboard/Resources/PlanIcons/snapshot.png | Bin 0 -> 1729 bytes Dashboard/Resources/PlanIcons/sort.png | Bin 0 -> 1835 bytes Dashboard/Resources/PlanIcons/split.png | Bin 0 -> 1568 bytes Dashboard/Resources/PlanIcons/spool.png | Bin 0 -> 1684 bytes Dashboard/Resources/PlanIcons/sql.png | Bin 0 -> 3718 bytes .../Resources/PlanIcons/stream_aggregate.png | Bin 0 -> 2110 bytes Dashboard/Resources/PlanIcons/switch.png | Bin 0 -> 1687 bytes .../Resources/PlanIcons/table_delete.png | Bin 0 -> 1189 bytes .../Resources/PlanIcons/table_insert.png | Bin 0 -> 1121 bytes Dashboard/Resources/PlanIcons/table_merge.png | Bin 0 -> 1772 bytes Dashboard/Resources/PlanIcons/table_scan.png | Bin 0 -> 1075 bytes Dashboard/Resources/PlanIcons/table_spool.png | Bin 0 -> 1463 bytes .../Resources/PlanIcons/table_update.png | Bin 0 -> 1463 bytes .../PlanIcons/table_valued_function.png | Bin 0 -> 1921 bytes Dashboard/Resources/PlanIcons/top.png | Bin 0 -> 867 bytes Dashboard/Resources/PlanIcons/trim.png | Bin 0 -> 1822 bytes Dashboard/Resources/PlanIcons/udx.png | Bin 0 -> 1764 bytes Dashboard/Resources/PlanIcons/union.png | Bin 0 -> 883 bytes Dashboard/Resources/PlanIcons/union_all.png | Bin 0 -> 875 bytes Dashboard/Resources/PlanIcons/update.png | Bin 0 -> 1475 bytes .../Resources/PlanIcons/window_aggregate.png | Bin 0 -> 1962 bytes Dashboard/ServerTab.xaml | 5 + Dashboard/ServerTab.xaml.cs | 5 + Dashboard/Services/PlanIconMapper.cs | 208 +++++++ Dashboard/Services/PlanLayoutEngine.cs | 66 +++ Dashboard/Services/ShowPlanParser.cs | 495 ++++++++++++++++ Lite/Controls/PlanViewerControl.xaml | 100 ++++ Lite/Controls/PlanViewerControl.xaml.cs | 546 ++++++++++++++++++ Lite/Controls/ServerTab.xaml | 11 +- Lite/Controls/ServerTab.xaml.cs | 56 ++ Lite/Models/PlanModels.cs | 129 +++++ Lite/PerformanceMonitorLite.csproj | 1 + Lite/Resources/PlanIcons/adaptive_join.png | Bin 0 -> 2148 bytes Lite/Resources/PlanIcons/aggregate.png | Bin 0 -> 2035 bytes Lite/Resources/PlanIcons/apply.png | Bin 0 -> 1184 bytes .../PlanIcons/arithmetic_expression.png | Bin 0 -> 2644 bytes Lite/Resources/PlanIcons/assert.png | Bin 0 -> 867 bytes Lite/Resources/PlanIcons/assign.png | Bin 0 -> 2615 bytes .../PlanIcons/batch_hash_table_build.png | Bin 0 -> 1386 bytes Lite/Resources/PlanIcons/bitmap.png | Bin 0 -> 1885 bytes Lite/Resources/PlanIcons/bookmark_lookup.png | Bin 0 -> 1632 bytes Lite/Resources/PlanIcons/broadcast.png | Bin 0 -> 2409 bytes .../PlanIcons/clustered_index_delete.png | Bin 0 -> 3038 bytes .../PlanIcons/clustered_index_insert.png | Bin 0 -> 2928 bytes .../PlanIcons/clustered_index_merge.png | Bin 0 -> 3231 bytes .../PlanIcons/clustered_index_scan.png | Bin 0 -> 2838 bytes .../PlanIcons/clustered_index_seek.png | Bin 0 -> 4774 bytes .../PlanIcons/clustered_index_update.png | Bin 0 -> 3381 bytes Lite/Resources/PlanIcons/clustered_update.png | Bin 0 -> 3902 bytes Lite/Resources/PlanIcons/collapse.png | Bin 0 -> 1449 bytes .../PlanIcons/columnstore_index_delete.png | Bin 0 -> 1441 bytes .../PlanIcons/columnstore_index_insert.png | Bin 0 -> 1623 bytes .../PlanIcons/columnstore_index_merge.png | Bin 0 -> 2970 bytes .../PlanIcons/columnstore_index_scan.png | Bin 0 -> 1298 bytes .../PlanIcons/columnstore_index_update.png | Bin 0 -> 1812 bytes Lite/Resources/PlanIcons/compute_scalar.png | Bin 0 -> 1106 bytes .../PlanIcons/compute_to_control_node.png | Bin 0 -> 1946 bytes Lite/Resources/PlanIcons/concatenation.png | Bin 0 -> 908 bytes Lite/Resources/PlanIcons/const_table_get.png | Bin 0 -> 1327 bytes Lite/Resources/PlanIcons/constant_scan.png | Bin 0 -> 1114 bytes .../PlanIcons/control_to_compute_nodes.png | Bin 0 -> 1992 bytes Lite/Resources/PlanIcons/convert.png | Bin 0 -> 2932 bytes Lite/Resources/PlanIcons/cursor_catch_all.png | Bin 0 -> 1865 bytes Lite/Resources/PlanIcons/declare.png | Bin 0 -> 1981 bytes Lite/Resources/PlanIcons/delete.png | Bin 0 -> 1601 bytes Lite/Resources/PlanIcons/deleted_scan.png | Bin 0 -> 1644 bytes Lite/Resources/PlanIcons/dynamic.png | Bin 0 -> 1459 bytes .../PlanIcons/external_broadcast.png | Bin 0 -> 2538 bytes Lite/Resources/PlanIcons/external_export.png | Bin 0 -> 1707 bytes .../PlanIcons/external_local_streaming.png | Bin 0 -> 1353 bytes .../PlanIcons/external_round_robin.png | Bin 0 -> 1965 bytes Lite/Resources/PlanIcons/external_shuffle.png | Bin 0 -> 2564 bytes Lite/Resources/PlanIcons/fetch_query.png | Bin 0 -> 1472 bytes Lite/Resources/PlanIcons/filter.png | Bin 0 -> 980 bytes .../foreign_key_references_check.png | Bin 0 -> 1465 bytes Lite/Resources/PlanIcons/get.png | Bin 0 -> 1313 bytes .../PlanIcons/group_by_aggregate.png | Bin 0 -> 1615 bytes Lite/Resources/PlanIcons/hash_match.png | Bin 0 -> 1235 bytes Lite/Resources/PlanIcons/hash_match_root.png | Bin 0 -> 1308 bytes Lite/Resources/PlanIcons/hash_match_team.png | Bin 0 -> 1342 bytes Lite/Resources/PlanIcons/if.png | Bin 0 -> 4548 bytes Lite/Resources/PlanIcons/index_delete.png | Bin 0 -> 2292 bytes Lite/Resources/PlanIcons/index_insert.png | Bin 0 -> 2138 bytes Lite/Resources/PlanIcons/index_scan.png | Bin 0 -> 2188 bytes Lite/Resources/PlanIcons/index_seek.png | Bin 0 -> 3583 bytes Lite/Resources/PlanIcons/index_spool.png | Bin 0 -> 2675 bytes Lite/Resources/PlanIcons/index_update.png | Bin 0 -> 2595 bytes Lite/Resources/PlanIcons/insert.png | Bin 0 -> 966 bytes Lite/Resources/PlanIcons/inserted_scan.png | Bin 0 -> 1440 bytes Lite/Resources/PlanIcons/intrinsic.png | Bin 0 -> 1973 bytes .../PlanIcons/iterator_catch_all.png | Bin 0 -> 843 bytes Lite/Resources/PlanIcons/join.png | Bin 0 -> 1124 bytes Lite/Resources/PlanIcons/keyset.png | Bin 0 -> 3930 bytes .../language_construct_catch_all.png | Bin 0 -> 1880 bytes Lite/Resources/PlanIcons/locate.png | Bin 0 -> 2686 bytes Lite/Resources/PlanIcons/log_row_scan.png | Bin 0 -> 1240 bytes Lite/Resources/PlanIcons/merge_interval.png | Bin 0 -> 1638 bytes Lite/Resources/PlanIcons/merge_join.png | Bin 0 -> 1608 bytes Lite/Resources/PlanIcons/nested_loops.png | Bin 0 -> 1419 bytes Lite/Resources/PlanIcons/parallelism.png | Bin 0 -> 1558 bytes .../PlanIcons/parameter_table_scan.png | Bin 0 -> 1094 bytes Lite/Resources/PlanIcons/population_query.png | Bin 0 -> 1417 bytes Lite/Resources/PlanIcons/predict.png | Bin 0 -> 5193 bytes Lite/Resources/PlanIcons/print.png | Bin 0 -> 2077 bytes Lite/Resources/PlanIcons/project.png | Bin 0 -> 783 bytes Lite/Resources/PlanIcons/rank.png | Bin 0 -> 1475 bytes Lite/Resources/PlanIcons/refresh_query.png | Bin 0 -> 1873 bytes Lite/Resources/PlanIcons/remote_delete.png | Bin 0 -> 1405 bytes .../Resources/PlanIcons/remote_index_scan.png | Bin 0 -> 2242 bytes .../Resources/PlanIcons/remote_index_seek.png | Bin 0 -> 2103 bytes Lite/Resources/PlanIcons/remote_insert.png | Bin 0 -> 1299 bytes Lite/Resources/PlanIcons/remote_query.png | Bin 0 -> 1122 bytes Lite/Resources/PlanIcons/remote_scan.png | Bin 0 -> 1333 bytes Lite/Resources/PlanIcons/remote_update.png | Bin 0 -> 1755 bytes Lite/Resources/PlanIcons/result.png | Bin 0 -> 908 bytes Lite/Resources/PlanIcons/rid_lookup.png | Bin 0 -> 3250 bytes Lite/Resources/PlanIcons/row_count_spool.png | Bin 0 -> 1663 bytes Lite/Resources/PlanIcons/segment.png | Bin 0 -> 897 bytes Lite/Resources/PlanIcons/sequence.png | Bin 0 -> 995 bytes Lite/Resources/PlanIcons/sequence_project.png | Bin 0 -> 1328 bytes Lite/Resources/PlanIcons/set_function.png | Bin 0 -> 3064 bytes Lite/Resources/PlanIcons/shuffle.png | Bin 0 -> 2415 bytes .../PlanIcons/single_source_round_robin.png | Bin 0 -> 1820 bytes .../PlanIcons/single_source_shuffle.png | Bin 0 -> 1822 bytes Lite/Resources/PlanIcons/snapshot.png | Bin 0 -> 1729 bytes Lite/Resources/PlanIcons/sort.png | Bin 0 -> 1835 bytes Lite/Resources/PlanIcons/split.png | Bin 0 -> 1568 bytes Lite/Resources/PlanIcons/spool.png | Bin 0 -> 1684 bytes Lite/Resources/PlanIcons/sql.png | Bin 0 -> 3718 bytes Lite/Resources/PlanIcons/stream_aggregate.png | Bin 0 -> 2110 bytes Lite/Resources/PlanIcons/switch.png | Bin 0 -> 1687 bytes Lite/Resources/PlanIcons/table_delete.png | Bin 0 -> 1189 bytes Lite/Resources/PlanIcons/table_insert.png | Bin 0 -> 1121 bytes Lite/Resources/PlanIcons/table_merge.png | Bin 0 -> 1772 bytes Lite/Resources/PlanIcons/table_scan.png | Bin 0 -> 1075 bytes Lite/Resources/PlanIcons/table_spool.png | Bin 0 -> 1463 bytes Lite/Resources/PlanIcons/table_update.png | Bin 0 -> 1463 bytes .../PlanIcons/table_valued_function.png | Bin 0 -> 1921 bytes Lite/Resources/PlanIcons/top.png | Bin 0 -> 867 bytes Lite/Resources/PlanIcons/trim.png | Bin 0 -> 1822 bytes Lite/Resources/PlanIcons/udx.png | Bin 0 -> 1764 bytes Lite/Resources/PlanIcons/union.png | Bin 0 -> 883 bytes Lite/Resources/PlanIcons/union_all.png | Bin 0 -> 875 bytes Lite/Resources/PlanIcons/update.png | Bin 0 -> 1475 bytes Lite/Resources/PlanIcons/window_aggregate.png | Bin 0 -> 1962 bytes Lite/Services/PlanIconMapper.cs | 208 +++++++ Lite/Services/PlanLayoutEngine.cs | 66 +++ Lite/Services/ShowPlanParser.cs | 483 ++++++++++++++++ THIRD_PARTY_NOTICES.md | 40 +- 247 files changed, 3247 insertions(+), 2 deletions(-) create mode 100644 Dashboard/Controls/PlanViewerControl.xaml create mode 100644 Dashboard/Controls/PlanViewerControl.xaml.cs create mode 100644 Dashboard/Models/PlanModels.cs create mode 100644 Dashboard/Resources/PlanIcons/adaptive_join.png create mode 100644 Dashboard/Resources/PlanIcons/aggregate.png create mode 100644 Dashboard/Resources/PlanIcons/apply.png create mode 100644 Dashboard/Resources/PlanIcons/arithmetic_expression.png create mode 100644 Dashboard/Resources/PlanIcons/assert.png create mode 100644 Dashboard/Resources/PlanIcons/assign.png create mode 100644 Dashboard/Resources/PlanIcons/batch_hash_table_build.png create mode 100644 Dashboard/Resources/PlanIcons/bitmap.png create mode 100644 Dashboard/Resources/PlanIcons/bookmark_lookup.png create mode 100644 Dashboard/Resources/PlanIcons/broadcast.png create mode 100644 Dashboard/Resources/PlanIcons/clustered_index_delete.png create mode 100644 Dashboard/Resources/PlanIcons/clustered_index_insert.png create mode 100644 Dashboard/Resources/PlanIcons/clustered_index_merge.png create mode 100644 Dashboard/Resources/PlanIcons/clustered_index_scan.png create mode 100644 Dashboard/Resources/PlanIcons/clustered_index_seek.png create mode 100644 Dashboard/Resources/PlanIcons/clustered_index_update.png create mode 100644 Dashboard/Resources/PlanIcons/clustered_update.png create mode 100644 Dashboard/Resources/PlanIcons/collapse.png create mode 100644 Dashboard/Resources/PlanIcons/columnstore_index_delete.png create mode 100644 Dashboard/Resources/PlanIcons/columnstore_index_insert.png create mode 100644 Dashboard/Resources/PlanIcons/columnstore_index_merge.png create mode 100644 Dashboard/Resources/PlanIcons/columnstore_index_scan.png create mode 100644 Dashboard/Resources/PlanIcons/columnstore_index_update.png create mode 100644 Dashboard/Resources/PlanIcons/compute_scalar.png create mode 100644 Dashboard/Resources/PlanIcons/compute_to_control_node.png create mode 100644 Dashboard/Resources/PlanIcons/concatenation.png create mode 100644 Dashboard/Resources/PlanIcons/const_table_get.png create mode 100644 Dashboard/Resources/PlanIcons/constant_scan.png create mode 100644 Dashboard/Resources/PlanIcons/control_to_compute_nodes.png create mode 100644 Dashboard/Resources/PlanIcons/convert.png create mode 100644 Dashboard/Resources/PlanIcons/cursor_catch_all.png create mode 100644 Dashboard/Resources/PlanIcons/declare.png create mode 100644 Dashboard/Resources/PlanIcons/delete.png create mode 100644 Dashboard/Resources/PlanIcons/deleted_scan.png create mode 100644 Dashboard/Resources/PlanIcons/dynamic.png create mode 100644 Dashboard/Resources/PlanIcons/external_broadcast.png create mode 100644 Dashboard/Resources/PlanIcons/external_export.png create mode 100644 Dashboard/Resources/PlanIcons/external_local_streaming.png create mode 100644 Dashboard/Resources/PlanIcons/external_round_robin.png create mode 100644 Dashboard/Resources/PlanIcons/external_shuffle.png create mode 100644 Dashboard/Resources/PlanIcons/fetch_query.png create mode 100644 Dashboard/Resources/PlanIcons/filter.png create mode 100644 Dashboard/Resources/PlanIcons/foreign_key_references_check.png create mode 100644 Dashboard/Resources/PlanIcons/get.png create mode 100644 Dashboard/Resources/PlanIcons/group_by_aggregate.png create mode 100644 Dashboard/Resources/PlanIcons/hash_match.png create mode 100644 Dashboard/Resources/PlanIcons/hash_match_root.png create mode 100644 Dashboard/Resources/PlanIcons/hash_match_team.png create mode 100644 Dashboard/Resources/PlanIcons/if.png create mode 100644 Dashboard/Resources/PlanIcons/index_delete.png create mode 100644 Dashboard/Resources/PlanIcons/index_insert.png create mode 100644 Dashboard/Resources/PlanIcons/index_scan.png create mode 100644 Dashboard/Resources/PlanIcons/index_seek.png create mode 100644 Dashboard/Resources/PlanIcons/index_spool.png create mode 100644 Dashboard/Resources/PlanIcons/index_update.png create mode 100644 Dashboard/Resources/PlanIcons/insert.png create mode 100644 Dashboard/Resources/PlanIcons/inserted_scan.png create mode 100644 Dashboard/Resources/PlanIcons/intrinsic.png create mode 100644 Dashboard/Resources/PlanIcons/iterator_catch_all.png create mode 100644 Dashboard/Resources/PlanIcons/join.png create mode 100644 Dashboard/Resources/PlanIcons/keyset.png create mode 100644 Dashboard/Resources/PlanIcons/language_construct_catch_all.png create mode 100644 Dashboard/Resources/PlanIcons/locate.png create mode 100644 Dashboard/Resources/PlanIcons/log_row_scan.png create mode 100644 Dashboard/Resources/PlanIcons/merge_interval.png create mode 100644 Dashboard/Resources/PlanIcons/merge_join.png create mode 100644 Dashboard/Resources/PlanIcons/nested_loops.png create mode 100644 Dashboard/Resources/PlanIcons/parallelism.png create mode 100644 Dashboard/Resources/PlanIcons/parameter_table_scan.png create mode 100644 Dashboard/Resources/PlanIcons/population_query.png create mode 100644 Dashboard/Resources/PlanIcons/predict.png create mode 100644 Dashboard/Resources/PlanIcons/print.png create mode 100644 Dashboard/Resources/PlanIcons/project.png create mode 100644 Dashboard/Resources/PlanIcons/rank.png create mode 100644 Dashboard/Resources/PlanIcons/refresh_query.png create mode 100644 Dashboard/Resources/PlanIcons/remote_delete.png create mode 100644 Dashboard/Resources/PlanIcons/remote_index_scan.png create mode 100644 Dashboard/Resources/PlanIcons/remote_index_seek.png create mode 100644 Dashboard/Resources/PlanIcons/remote_insert.png create mode 100644 Dashboard/Resources/PlanIcons/remote_query.png create mode 100644 Dashboard/Resources/PlanIcons/remote_scan.png create mode 100644 Dashboard/Resources/PlanIcons/remote_update.png create mode 100644 Dashboard/Resources/PlanIcons/result.png create mode 100644 Dashboard/Resources/PlanIcons/rid_lookup.png create mode 100644 Dashboard/Resources/PlanIcons/row_count_spool.png create mode 100644 Dashboard/Resources/PlanIcons/segment.png create mode 100644 Dashboard/Resources/PlanIcons/sequence.png create mode 100644 Dashboard/Resources/PlanIcons/sequence_project.png create mode 100644 Dashboard/Resources/PlanIcons/set_function.png create mode 100644 Dashboard/Resources/PlanIcons/shuffle.png create mode 100644 Dashboard/Resources/PlanIcons/single_source_round_robin.png create mode 100644 Dashboard/Resources/PlanIcons/single_source_shuffle.png create mode 100644 Dashboard/Resources/PlanIcons/snapshot.png create mode 100644 Dashboard/Resources/PlanIcons/sort.png create mode 100644 Dashboard/Resources/PlanIcons/split.png create mode 100644 Dashboard/Resources/PlanIcons/spool.png create mode 100644 Dashboard/Resources/PlanIcons/sql.png create mode 100644 Dashboard/Resources/PlanIcons/stream_aggregate.png create mode 100644 Dashboard/Resources/PlanIcons/switch.png create mode 100644 Dashboard/Resources/PlanIcons/table_delete.png create mode 100644 Dashboard/Resources/PlanIcons/table_insert.png create mode 100644 Dashboard/Resources/PlanIcons/table_merge.png create mode 100644 Dashboard/Resources/PlanIcons/table_scan.png create mode 100644 Dashboard/Resources/PlanIcons/table_spool.png create mode 100644 Dashboard/Resources/PlanIcons/table_update.png create mode 100644 Dashboard/Resources/PlanIcons/table_valued_function.png create mode 100644 Dashboard/Resources/PlanIcons/top.png create mode 100644 Dashboard/Resources/PlanIcons/trim.png create mode 100644 Dashboard/Resources/PlanIcons/udx.png create mode 100644 Dashboard/Resources/PlanIcons/union.png create mode 100644 Dashboard/Resources/PlanIcons/union_all.png create mode 100644 Dashboard/Resources/PlanIcons/update.png create mode 100644 Dashboard/Resources/PlanIcons/window_aggregate.png create mode 100644 Dashboard/Services/PlanIconMapper.cs create mode 100644 Dashboard/Services/PlanLayoutEngine.cs create mode 100644 Dashboard/Services/ShowPlanParser.cs create mode 100644 Lite/Controls/PlanViewerControl.xaml create mode 100644 Lite/Controls/PlanViewerControl.xaml.cs create mode 100644 Lite/Models/PlanModels.cs create mode 100644 Lite/Resources/PlanIcons/adaptive_join.png create mode 100644 Lite/Resources/PlanIcons/aggregate.png create mode 100644 Lite/Resources/PlanIcons/apply.png create mode 100644 Lite/Resources/PlanIcons/arithmetic_expression.png create mode 100644 Lite/Resources/PlanIcons/assert.png create mode 100644 Lite/Resources/PlanIcons/assign.png create mode 100644 Lite/Resources/PlanIcons/batch_hash_table_build.png create mode 100644 Lite/Resources/PlanIcons/bitmap.png create mode 100644 Lite/Resources/PlanIcons/bookmark_lookup.png create mode 100644 Lite/Resources/PlanIcons/broadcast.png create mode 100644 Lite/Resources/PlanIcons/clustered_index_delete.png create mode 100644 Lite/Resources/PlanIcons/clustered_index_insert.png create mode 100644 Lite/Resources/PlanIcons/clustered_index_merge.png create mode 100644 Lite/Resources/PlanIcons/clustered_index_scan.png create mode 100644 Lite/Resources/PlanIcons/clustered_index_seek.png create mode 100644 Lite/Resources/PlanIcons/clustered_index_update.png create mode 100644 Lite/Resources/PlanIcons/clustered_update.png create mode 100644 Lite/Resources/PlanIcons/collapse.png create mode 100644 Lite/Resources/PlanIcons/columnstore_index_delete.png create mode 100644 Lite/Resources/PlanIcons/columnstore_index_insert.png create mode 100644 Lite/Resources/PlanIcons/columnstore_index_merge.png create mode 100644 Lite/Resources/PlanIcons/columnstore_index_scan.png create mode 100644 Lite/Resources/PlanIcons/columnstore_index_update.png create mode 100644 Lite/Resources/PlanIcons/compute_scalar.png create mode 100644 Lite/Resources/PlanIcons/compute_to_control_node.png create mode 100644 Lite/Resources/PlanIcons/concatenation.png create mode 100644 Lite/Resources/PlanIcons/const_table_get.png create mode 100644 Lite/Resources/PlanIcons/constant_scan.png create mode 100644 Lite/Resources/PlanIcons/control_to_compute_nodes.png create mode 100644 Lite/Resources/PlanIcons/convert.png create mode 100644 Lite/Resources/PlanIcons/cursor_catch_all.png create mode 100644 Lite/Resources/PlanIcons/declare.png create mode 100644 Lite/Resources/PlanIcons/delete.png create mode 100644 Lite/Resources/PlanIcons/deleted_scan.png create mode 100644 Lite/Resources/PlanIcons/dynamic.png create mode 100644 Lite/Resources/PlanIcons/external_broadcast.png create mode 100644 Lite/Resources/PlanIcons/external_export.png create mode 100644 Lite/Resources/PlanIcons/external_local_streaming.png create mode 100644 Lite/Resources/PlanIcons/external_round_robin.png create mode 100644 Lite/Resources/PlanIcons/external_shuffle.png create mode 100644 Lite/Resources/PlanIcons/fetch_query.png create mode 100644 Lite/Resources/PlanIcons/filter.png create mode 100644 Lite/Resources/PlanIcons/foreign_key_references_check.png create mode 100644 Lite/Resources/PlanIcons/get.png create mode 100644 Lite/Resources/PlanIcons/group_by_aggregate.png create mode 100644 Lite/Resources/PlanIcons/hash_match.png create mode 100644 Lite/Resources/PlanIcons/hash_match_root.png create mode 100644 Lite/Resources/PlanIcons/hash_match_team.png create mode 100644 Lite/Resources/PlanIcons/if.png create mode 100644 Lite/Resources/PlanIcons/index_delete.png create mode 100644 Lite/Resources/PlanIcons/index_insert.png create mode 100644 Lite/Resources/PlanIcons/index_scan.png create mode 100644 Lite/Resources/PlanIcons/index_seek.png create mode 100644 Lite/Resources/PlanIcons/index_spool.png create mode 100644 Lite/Resources/PlanIcons/index_update.png create mode 100644 Lite/Resources/PlanIcons/insert.png create mode 100644 Lite/Resources/PlanIcons/inserted_scan.png create mode 100644 Lite/Resources/PlanIcons/intrinsic.png create mode 100644 Lite/Resources/PlanIcons/iterator_catch_all.png create mode 100644 Lite/Resources/PlanIcons/join.png create mode 100644 Lite/Resources/PlanIcons/keyset.png create mode 100644 Lite/Resources/PlanIcons/language_construct_catch_all.png create mode 100644 Lite/Resources/PlanIcons/locate.png create mode 100644 Lite/Resources/PlanIcons/log_row_scan.png create mode 100644 Lite/Resources/PlanIcons/merge_interval.png create mode 100644 Lite/Resources/PlanIcons/merge_join.png create mode 100644 Lite/Resources/PlanIcons/nested_loops.png create mode 100644 Lite/Resources/PlanIcons/parallelism.png create mode 100644 Lite/Resources/PlanIcons/parameter_table_scan.png create mode 100644 Lite/Resources/PlanIcons/population_query.png create mode 100644 Lite/Resources/PlanIcons/predict.png create mode 100644 Lite/Resources/PlanIcons/print.png create mode 100644 Lite/Resources/PlanIcons/project.png create mode 100644 Lite/Resources/PlanIcons/rank.png create mode 100644 Lite/Resources/PlanIcons/refresh_query.png create mode 100644 Lite/Resources/PlanIcons/remote_delete.png create mode 100644 Lite/Resources/PlanIcons/remote_index_scan.png create mode 100644 Lite/Resources/PlanIcons/remote_index_seek.png create mode 100644 Lite/Resources/PlanIcons/remote_insert.png create mode 100644 Lite/Resources/PlanIcons/remote_query.png create mode 100644 Lite/Resources/PlanIcons/remote_scan.png create mode 100644 Lite/Resources/PlanIcons/remote_update.png create mode 100644 Lite/Resources/PlanIcons/result.png create mode 100644 Lite/Resources/PlanIcons/rid_lookup.png create mode 100644 Lite/Resources/PlanIcons/row_count_spool.png create mode 100644 Lite/Resources/PlanIcons/segment.png create mode 100644 Lite/Resources/PlanIcons/sequence.png create mode 100644 Lite/Resources/PlanIcons/sequence_project.png create mode 100644 Lite/Resources/PlanIcons/set_function.png create mode 100644 Lite/Resources/PlanIcons/shuffle.png create mode 100644 Lite/Resources/PlanIcons/single_source_round_robin.png create mode 100644 Lite/Resources/PlanIcons/single_source_shuffle.png create mode 100644 Lite/Resources/PlanIcons/snapshot.png create mode 100644 Lite/Resources/PlanIcons/sort.png create mode 100644 Lite/Resources/PlanIcons/split.png create mode 100644 Lite/Resources/PlanIcons/spool.png create mode 100644 Lite/Resources/PlanIcons/sql.png create mode 100644 Lite/Resources/PlanIcons/stream_aggregate.png create mode 100644 Lite/Resources/PlanIcons/switch.png create mode 100644 Lite/Resources/PlanIcons/table_delete.png create mode 100644 Lite/Resources/PlanIcons/table_insert.png create mode 100644 Lite/Resources/PlanIcons/table_merge.png create mode 100644 Lite/Resources/PlanIcons/table_scan.png create mode 100644 Lite/Resources/PlanIcons/table_spool.png create mode 100644 Lite/Resources/PlanIcons/table_update.png create mode 100644 Lite/Resources/PlanIcons/table_valued_function.png create mode 100644 Lite/Resources/PlanIcons/top.png create mode 100644 Lite/Resources/PlanIcons/trim.png create mode 100644 Lite/Resources/PlanIcons/udx.png create mode 100644 Lite/Resources/PlanIcons/union.png create mode 100644 Lite/Resources/PlanIcons/union_all.png create mode 100644 Lite/Resources/PlanIcons/update.png create mode 100644 Lite/Resources/PlanIcons/window_aggregate.png create mode 100644 Lite/Services/PlanIconMapper.cs create mode 100644 Lite/Services/PlanLayoutEngine.cs create mode 100644 Lite/Services/ShowPlanParser.cs diff --git a/Dashboard/Controls/PlanViewerControl.xaml b/Dashboard/Controls/PlanViewerControl.xaml new file mode 100644 index 0000000..4734f44 --- /dev/null +++ b/Dashboard/Controls/PlanViewerControl.xaml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + +