Class: Mxrb::Oql::SqlServerPlanAnalyzer

Inherits:
Object
  • Object
show all
Defined in:
lib/mxrb/oql/sql_server_plan_analyzer.rb

Overview

Parses SQL Server SHOWPLAN XML without executing or rewriting the query. Missing-index entries are optimizer hypotheses, not DDL instructions.

Constant Summary collapse

LARGE_ROWS =

rubocop:disable Metrics/ClassLength

1_000
HIGH_NESTED_ROWS =
10_000
MISESTIMATE_RATIO =
10.0

Instance Method Summary collapse

Instance Method Details

#analyze(xml) ⇒ Object

rubocop:disable Metrics/AbcSize, Metrics/MethodLength



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/mxrb/oql/sql_server_plan_analyzer.rb', line 15

def analyze(xml)
  document = REXML::Document.new(xml.to_s)
  root = document.root
  raise ArgumentError, 'invalid SQL Server SHOWPLAN XML' unless root&.name == 'ShowPlanXML'

  findings = [*operator_findings(root), *missing_index_findings(root)].freeze
  statement = elements(root, 'StmtSimple').first
  runtime = elements(root, 'QueryTimeStats').first
  PlanReport.new(
    :sql_server, !runtime.nil?, nil, attribute_number(runtime, 'ElapsedTime'),
    attribute_number(statement, 'StatementSubTreeCost'), findings, xml.to_s.freeze
  )
rescue REXML::ParseException => e
  raise ArgumentError, "invalid SQL Server SHOWPLAN XML: #{e.message}"
end