private static void DumpPlanInternal <T>(IQueryable <T> queryable, bool dumpData, bool addNewPanel) { if (Util.CurrentDataContext != null && !(Util.CurrentDataContext.Connection is SqlConnection)) { ShowError("Query Plan Visualizer supports only Sql Server"); return; } var databaseHelper = DatabaseHelper.Create(Util.CurrentDataContext, queryable); if (dumpData) { queryable.Dump(); } try { var planXml = databaseHelper.GetSqlServerQueryExecutionPlan(queryable); var control = PanelManager.GetOutputPanel(ExecutionPlanPanelTitle)?.GetControl() as QueryPlanUserControl; if (control == null || addNewPanel) { control = new QueryPlanUserControl { DatabaseHelper = databaseHelper }; if (queryable != null) { control.IndexCreated += (sender, args) => { if (MessageBox.Show("Index created. Refresh query plan?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { DumpPlanInternal(queryable, false, false); } }; } PanelManager.DisplayControl(control, ExecutionPlanPanelTitle); } ProcessQueryPlan(planXml, control); } catch (Exception exception) { ShowError(exception.ToString()); } }
public static void DumpPlanXml(string planXml) { try { var control = new QueryPlanUserControl(); PanelManager.DisplayControl(control, ExecutionPlanPanelTitle); ProcessQueryPlan(planXml, control); } catch (Exception exception) { ShowError(exception.ToString()); } }
private static void ProcessQueryPlan(string planXml, QueryPlanUserControl control) { if (string.IsNullOrEmpty(planXml)) { ShowError("Cannot retrieve query plan"); return; } var queryPlanProcessor = new QueryPlanProcessor(planXml); var indexes = queryPlanProcessor.GetMissingIndexes(); var planHtml = queryPlanProcessor.ConvertPlanToHtml(); var files = ExtractFiles(); files.Add(planHtml); var html = string.Format(Resources.template, files.ToArray()); control.DisplayExecutionPlanDetails(planXml, html, indexes); }
private static void DumpPlanInternal <T>(IQueryable <T> queryable, bool dumpData) { var ormHelper = OrmHelper.Create(queryable, Util.CurrentDataContext); if (ormHelper == null) { ShowError("The selected database or database driver isn't supported"); return; } if (dumpData) { queryable.Dump(); } if (ormHelper.DatabaseProvider == null) { ShowError("Selected database not supported"); return; } var rawPlan = ormHelper.DatabaseProvider.ExtractPlan(); if (string.IsNullOrEmpty(rawPlan)) { ShowError("Cannot extract query plan"); return; } var control = new QueryPlanUserControl { DatabaseProvider = ormHelper.DatabaseProvider, PlanProcessor = ormHelper.PlanProcessor }; control.DisplayPlan(rawPlan); control.Dump(ExecutionPlanPanelTitle); }
private static void DumpPlanInternal <T>(IQueryable <T> queryable, bool dumpData, bool addNewPanel) { if (Util.CurrentDataContext != null && !(Util.CurrentDataContext.Connection is SqlConnection)) { ShowError("Query Plan Visualizer supports only Sql Server"); return; } var databaseHelper = DatabaseHelper.Create(Util.CurrentDataContext, queryable); if (dumpData) { queryable.Dump(); } try { var planXml = databaseHelper.GetSqlServerQueryExecutionPlan(queryable); if (string.IsNullOrEmpty(planXml)) { ShowError("Cannot retrieve query plan"); return; } var queryPlanProcessor = new QueryPlanProcessor(planXml); var indexes = queryPlanProcessor.GetMissingIndexes(); var planHtml = queryPlanProcessor.ConvertPlanToHtml(); var files = ExtractFiles(); files.Add(planHtml); var html = string.Format(Resources.template, files.ToArray()); var control = PanelManager.GetOutputPanel(ExecutionPlanPanelTitle)?.GetControl() as QueryPlanUserControl; if (control == null || addNewPanel) { control = new QueryPlanUserControl() { DatabaseHelper = databaseHelper }; control.IndexCreated += (sender, args) => { if (MessageBox.Show("Index created. Refresh query plan?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { DumpPlanInternal(queryable, false, false); } }; PanelManager.DisplayControl(control, ExecutionPlanPanelTitle); } control.DisplayExecutionPlanDetails(planXml, html, indexes); } catch (Exception exception) { ShowError(exception.ToString()); } }