Beispiel #1
0
        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());
            }
        }
Beispiel #2
0
        public static void DumpPlanXml(string planXml)
        {
            try
            {
                var control = new QueryPlanUserControl();

                PanelManager.DisplayControl(control, ExecutionPlanPanelTitle);

                ProcessQueryPlan(planXml, control);
            }
            catch (Exception exception)
            {
                ShowError(exception.ToString());
            }
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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());
            }
        }