activerecord-analyze 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +8 -3
- data/lib/activerecord-analyze/main.rb +14 -1
- data/lib/activerecord-analyze/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1f3e8c5511121ff7c9a7e2aab56d1638e1f42286477bfb97a72ae6d284f719b1
|
4
|
+
data.tar.gz: 0a6eba3afdf108a616ad837d9520148a2a387ab0ab3441afbbe2e9851e974e1e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 94223f7a2f15534a7b1d648cb5a019f4aeab0efef044a104ff70e4ee876cdc332de67dfdc86fb325aac5b847a515ae6b02846fed2a19c1b342df4e43b14c7e3d
|
7
|
+
data.tar.gz: 14aa9186a5e14d00dc6b6475d9d7052e00942d82bb5deafcb14f7c170a80282216c05597e102e9ce55c934807ceee145462d6f416ece2030ae21cfbbd495f3d8
|
data/README.md
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
This gem adds an `analyze` method to Active Record query objects. It executes `EXPLAIN ANALYZE` on a query SQL.
|
4
4
|
|
5
|
+
You can check out this blog post for more info on how to [debug and fix slow queries in Rails apps](https://pawelurbanek.com/slow-rails-queries).
|
6
|
+
|
5
7
|
## Installation
|
6
8
|
|
7
9
|
In your Gemfile:
|
@@ -14,7 +16,7 @@ gem 'activerecord-analyze'
|
|
14
16
|
|
15
17
|
## Options
|
16
18
|
|
17
|
-
The `analyze` method supports the following EXPLAIN query options (
|
19
|
+
The `analyze` method supports the following EXPLAIN query options ([PostgreSQL docs reference](https://www.postgresql.org/docs/12/sql-explain.html)):
|
18
20
|
|
19
21
|
```
|
20
22
|
VERBOSE [ boolean ]
|
@@ -26,7 +28,7 @@ SUMMARY [ boolean ]
|
|
26
28
|
FORMAT { TEXT | XML | JSON | YAML }
|
27
29
|
```
|
28
30
|
|
29
|
-
You can
|
31
|
+
You can execute it like that:
|
30
32
|
|
31
33
|
```ruby
|
32
34
|
|
@@ -41,7 +43,7 @@ User.all.analyze(
|
|
41
43
|
)
|
42
44
|
|
43
45
|
# EXPLAIN (FORMAT JSON, ANALYZE, VERBOSE, COSTS, SETTINGS, BUFFERS, TIMING, SUMMARY)
|
44
|
-
#
|
46
|
+
# SELECT "users".* FROM "users"
|
45
47
|
# [
|
46
48
|
# {
|
47
49
|
# "Plan": {
|
@@ -58,6 +60,7 @@ User.all.analyze(
|
|
58
60
|
# "Actual Total Time": 0.007,
|
59
61
|
# "Actual Rows": 2,
|
60
62
|
# "Actual Loops": 1,
|
63
|
+
# "Output": ["id", "team_id", "email"],
|
61
64
|
# "Shared Hit Blocks": 1,
|
62
65
|
# "Shared Read Blocks": 0,
|
63
66
|
# "Shared Dirtied Blocks": 0,
|
@@ -89,6 +92,8 @@ User.all.analyze(
|
|
89
92
|
|
90
93
|
```
|
91
94
|
|
95
|
+
The following `format` options are supported `:json, :hash, :yaml, :text, :xml`. Especially the `:json` format is useful because it allows you to visualize a query plan using [a visualizer tool](https://tatiyants.com/pev/#/plans/new).
|
96
|
+
|
92
97
|
Optionally you can disable running the `ANALYZE` query and only generate the plan:
|
93
98
|
|
94
99
|
```ruby
|
@@ -7,6 +7,8 @@ module ActiveRecord
|
|
7
7
|
case fmt
|
8
8
|
when :json
|
9
9
|
"FORMAT JSON,"
|
10
|
+
when :hash
|
11
|
+
"FORMAT JSON,"
|
10
12
|
when :yaml
|
11
13
|
"FORMAT YAML,"
|
12
14
|
when :text
|
@@ -63,7 +65,18 @@ end
|
|
63
65
|
module ActiveRecord
|
64
66
|
class Relation
|
65
67
|
def analyze(opts = {})
|
66
|
-
exec_analyze(collecting_queries_for_explain { exec_queries }, opts)
|
68
|
+
res = exec_analyze(collecting_queries_for_explain { exec_queries }, opts)
|
69
|
+
if [:json, :hash].include?(opts[:format])
|
70
|
+
raw_json = "[" + res[/\[(.*?)(\(\d row)/m, 1]
|
71
|
+
|
72
|
+
if opts[:format] == :json
|
73
|
+
JSON.parse(raw_json).to_json
|
74
|
+
elsif opts[:format] == :hash
|
75
|
+
JSON.parse(raw_json)
|
76
|
+
end
|
77
|
+
else
|
78
|
+
res
|
79
|
+
end
|
67
80
|
end
|
68
81
|
end
|
69
82
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-analyze
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- pawurb
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-01-
|
11
|
+
date: 2021-01-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|