public void ExecuteExplainPlan(SqlObfuscator obfuscator) { // Don't re-run an explain plan if one already exists if (_explainPlan != null) { return; } try { // Using invoke for thread safety, DoExplainPlanCondition is nullable if (DoExplainPlanCondition?.Invoke() == true) { var explainPlan = GenerateExplainPlan?.Invoke(_explainPlanResources); if (explainPlan != null) { foreach (var data in explainPlan.ExplainPlanDatas) { foreach (var index in explainPlan.ObfuscatedHeaders) { data[index] = obfuscator.GetObfuscatedSql(data[index].ToString(), DatastoreVendorName); } } _explainPlan = new ExplainPlan(explainPlan.ExplainPlanHeaders, explainPlan.ExplainPlanDatas, explainPlan.ObfuscatedHeaders); } } } catch (Exception exception) { Log.DebugFormat("Unable to execute explain plan: {0}", exception); } }
private void TryGenerateExplainPlans(IEnumerable <Segment> segments) { if (!_configurationService.Configuration.SqlExplainPlansEnabled) { return; } try { using (new IgnoreWork()) { short count = 0; var sqlExplainPlansMax = _configurationService.Configuration.SqlExplainPlansMax; var threshold = _configurationService.Configuration.SqlExplainPlanThreshold; var obfuscator = SqlObfuscator.GetSqlObfuscator(_configurationService.Configuration.TransactionTracerEnabled, _configurationService.Configuration.TransactionTracerRecordSql); foreach (var segment in segments.Where(s => s.Data is DatastoreSegmentData)) { if (segment.Duration > threshold) { var datastoreSegmentData = (DatastoreSegmentData)segment.Data; if (datastoreSegmentData.DoExplainPlanCondition?.Invoke() == true) { datastoreSegmentData.ExecuteExplainPlan(obfuscator); if (++count >= sqlExplainPlansMax) { return; } } } } } } catch (Exception exception) { Log.DebugFormat("Exception occurred while generating explain plan: {0}", exception); } }