Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
heptapod
heptapod
Commits
74247f49dc95
Commit
58de6b58
authored
Jul 24, 2019
by
Andreas Brandl
Committed by
Nick Thomas
Jul 24, 2019
Browse files
Enable tablesample count strategy by default
https://gitlab.com/gitlab-org/gitlab-ce/issues/58792
parent
5bf96edf727b
Changes
9
Hide whitespace changes
Inline
Side-by-side
changelogs/unreleased/ab-count-strategies.yml
0 → 100644
View file @
74247f49
---
title
:
Use tablesample approximate counting by default.
merge_request
:
31048
author
:
type
:
performance
lib/gitlab/database/count.rb
View file @
74247f49
...
...
@@ -37,16 +37,14 @@ module Count
# @return [Hash] of Model -> count mapping
def
self
.
approximate_counts
(
models
,
strategies:
[
TablesampleCountStrategy
,
ReltuplesCountStrategy
,
ExactCountStrategy
])
strategies
.
each_with_object
({})
do
|
strategy
,
counts_by_model
|
if
strategy
.
enabled?
models_with_missing_counts
=
models
-
counts_by_model
.
keys
models_with_missing_counts
=
models
-
counts_by_model
.
keys
break
counts_by_model
if
models_with_missing_counts
.
empty?
break
counts_by_model
if
models_with_missing_counts
.
empty?
counts
=
strategy
.
new
(
models_with_missing_counts
).
count
counts
=
strategy
.
new
(
models_with_missing_counts
).
count
counts
.
each
do
|
model
,
count
|
counts_by_model
[
model
]
=
count
end
counts
.
each
do
|
model
,
count
|
counts_by_model
[
model
]
=
count
end
end
end
...
...
lib/gitlab/database/count/exact_count_strategy.rb
View file @
74247f49
...
...
@@ -23,10 +23,6 @@ def count
rescue
*
CONNECTION_ERRORS
{}
end
def
self
.
enabled?
true
end
end
end
end
...
...
lib/gitlab/database/count/reltuples_count_strategy.rb
View file @
74247f49
...
...
@@ -31,10 +31,6 @@ def count
{}
end
def
self
.
enabled?
Gitlab
::
Database
.
postgresql?
end
private
# Models using single-type inheritance (STI) don't work with
...
...
lib/gitlab/database/count/tablesample_count_strategy.rb
View file @
74247f49
...
...
@@ -28,10 +28,6 @@ def count
{}
end
def
self
.
enabled?
Gitlab
::
Database
.
postgresql?
&&
Feature
.
enabled?
(
:tablesample_counts
)
end
private
def
perform_count
(
model
,
estimate
)
...
...
spec/lib/gitlab/database/count/exact_count_strategy_spec.rb
View file @
74247f49
...
...
@@ -23,18 +23,4 @@
expect
(
subject
).
to
eq
({})
end
end
describe
'.enabled?'
do
it
'is enabled for PostgreSQL'
do
allow
(
Gitlab
::
Database
).
to
receive
(
:postgresql?
).
and_return
(
true
)
expect
(
described_class
.
enabled?
).
to
be_truthy
end
it
'is enabled for MySQL'
do
allow
(
Gitlab
::
Database
).
to
receive
(
:postgresql?
).
and_return
(
false
)
expect
(
described_class
.
enabled?
).
to
be_truthy
end
end
end
spec/lib/gitlab/database/count/reltuples_count_strategy_spec.rb
View file @
74247f49
...
...
@@ -48,18 +48,4 @@
end
end
end
describe
'.enabled?'
do
it
'is enabled for PostgreSQL'
do
allow
(
Gitlab
::
Database
).
to
receive
(
:postgresql?
).
and_return
(
true
)
expect
(
described_class
.
enabled?
).
to
be_truthy
end
it
'is disabled for MySQL'
do
allow
(
Gitlab
::
Database
).
to
receive
(
:postgresql?
).
and_return
(
false
)
expect
(
described_class
.
enabled?
).
to
be_falsey
end
end
end
spec/lib/gitlab/database/count/tablesample_count_strategy_spec.rb
View file @
74247f49
...
...
@@ -56,22 +56,4 @@
end
end
end
describe
'.enabled?'
do
before
do
stub_feature_flags
(
tablesample_counts:
true
)
end
it
'is enabled for PostgreSQL'
do
allow
(
Gitlab
::
Database
).
to
receive
(
:postgresql?
).
and_return
(
true
)
expect
(
described_class
.
enabled?
).
to
be_truthy
end
it
'is disabled for MySQL'
do
allow
(
Gitlab
::
Database
).
to
receive
(
:postgresql?
).
and_return
(
false
)
expect
(
described_class
.
enabled?
).
to
be_falsey
end
end
end
spec/lib/gitlab/database/count_spec.rb
View file @
74247f49
...
...
@@ -9,24 +9,13 @@
let
(
:models
)
{
[
Project
,
Identity
]
}
context
'.approximate_counts'
do
context
'selecting strategies'
do
let
(
:strategies
)
{
[
double
(
's1'
,
enabled?:
true
),
double
(
's2'
,
enabled?:
false
)]
}
it
'uses only enabled strategies'
do
expect
(
strategies
[
0
]).
to
receive
(
:new
).
and_return
(
double
(
'strategy1'
,
count:
{}))
expect
(
strategies
[
1
]).
not_to
receive
(
:new
)
described_class
.
approximate_counts
(
models
,
strategies:
strategies
)
end
end
context
'fallbacks'
do
subject
{
described_class
.
approximate_counts
(
models
,
strategies:
strategies
)
}
let
(
:strategies
)
do
[
double
(
's1'
,
enabled?:
true
,
new:
first_strategy
),
double
(
's2'
,
enabled?:
true
,
new:
second_strategy
)
double
(
's1'
,
new:
first_strategy
),
double
(
's2'
,
new:
second_strategy
)
]
end
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment