Exemple #1
0
 public void Start(QueryWorkerParameters workerParameters, Action <QueryExecution> onQueryExecutionComplete)
 {
     throw new NotImplementedException();
 }
        public void Start(
            QueryWorkerParameters workerParameters,
            Action <QueryExecution> onQueryExecutionComplete)
        {
            var query = $"SET STATISTICS XML ON;\n{workerParameters.Query}";

            var iteration = 0;

            while (iteration < workerParameters.Iterations && !workerParameters.CancellationToken.IsCancellationRequested)
            {
                var builder = new MssqlQueryExecutionBuilder()
                {
                    QueryParameters = workerParameters.QueryParameters
                };

                try
                {
                    using var con = new SqlConnection(workerParameters.ConnectionString);
                    using var cmd = new SqlCommand(query, con);

                    con.Open();

                    foreach (var param in workerParameters.QueryParameters.Parameters)
                    {
                        cmd.Parameters.AddWithValue(param.Name, param.Value);
                    }

                    var sw = Stopwatch.StartNew();
                    using (var reader = cmd.ExecuteReader())
                    {
                        // Don't include time to read the plan as part of the client execution time
                        sw.Stop();

                        if (reader.NextResult())
                        {
                            while (reader.Read())
                            {
                                builder.PlanXml = reader.GetString(0);
                            }
                        }
                    }

                    if (!string.IsNullOrWhiteSpace(builder.PlanXml))
                    {
                        var executionPlanParseResult = _executionPlanParser.Parse(builder.PlanXml);
                        builder.LogicalReads        = executionPlanParseResult.LogicalReads;
                        builder.ElapsedMilliseconds = executionPlanParseResult.ElapsedTime;
                        builder.CpuMilliseconds     = executionPlanParseResult.CpuTime;
                    }

                    builder.ClientElapsedMilliseconds = sw.Elapsed.TotalMilliseconds;
                }
                catch (Exception ex)
                {
                    builder.ExecutionError = ex;
                }

                onQueryExecutionComplete(builder.Build());
                iteration++;
            }
        }