Class: Dbviewer::QueryAnalyzer

Inherits:
Object
  • Object
show all
Defined in:
lib/dbviewer/query_analyzer.rb

Overview

QueryAnalyzer handles analysis of query patterns and statistics

Class Method Summary collapse

Class Method Details

.detect_potential_n_plus_1(queries) ⇒ Object

Detect potential N+1 query patterns



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/dbviewer/query_analyzer.rb', line 18

def self.detect_potential_n_plus_1(queries)
  potential_issues = []

  # Group queries by request_id
  queries.group_by { |q| q[:request_id] }.each do |request_id, request_queries|
    # Skip if there are too few queries to indicate a problem
    next if request_queries.size < 5

    # Look for repeated patterns within this request
    analyze_request_patterns(request_id, request_queries, potential_issues)
  end

  # Sort by number of repetitions (most problematic first)
  potential_issues.sort_by { |issue| -issue[:count] }
end

.generate_stats(queries) ⇒ Object

Calculate statistics for a collection of queries



5
6
7
8
9
10
11
12
13
14
15
# File 'lib/dbviewer/query_analyzer.rb', line 5

def self.generate_stats(queries)
  {
    total_count: queries.size,
    total_duration_ms: queries.sum { |q| q[:duration_ms] },
    avg_duration_ms: calculate_average_duration(queries),
    max_duration_ms: queries.map { |q| q[:duration_ms] }.max || 0,
    tables_queried: extract_queried_tables(queries),
    potential_n_plus_1: detect_potential_n_plus_1(queries),
    slowest_queries: get_slowest_queries(queries)
  }.merge(calculate_request_stats(queries))
end

.get_slowest_queries(queries, limit: 5) ⇒ Object

Get the slowest queries from the dataset



35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/dbviewer/query_analyzer.rb', line 35

def self.get_slowest_queries(queries, limit: 5)
  # Return top N slowest queries with relevant info
  queries.sort_by { |q| -q[:duration_ms] }
    .first(limit)
    .map do |q|
      {
        sql: q[:sql],
        duration_ms: q[:duration_ms],
        timestamp: q[:timestamp],
        request_id: q[:request_id],
        name: q[:name]
      }
    end
end