get_meter_statistics with query is unacceptably slow on sqlalchemy
Bug #1320772 reported by
Ondergetekende
This bug affects 1 person
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
Ceilometer |
Fix Released
|
High
|
Ondergetekende |
Bug Description
The existing queries rely heavilly on extremely greedy filtered subselects, which result in horrible perfomance. Rewriting these subselects to joins resulted in a 10000x performance increase for us (yes, that's ten thousand).
Changed in ceilometer: | |
milestone: | none → juno-1 |
importance: | Undecided → High |
Changed in ceilometer: | |
status: | Fix Committed → Fix Released |
Changed in ceilometer: | |
milestone: | juno-1 → 2014.2 |
To post a comment you must log in.
Original query:
SELECT sample. timestamp) AS tsmin, sample. timestamp) AS tsmax, sample. volume) AS count, sample. volume) AS max, sample. volume) AS sum, sample. volume) AS avg, sample. volume) AS min, resource_ id AS sample_resource_id
metadata_ text.id AS id,
metadata_ text.meta_ key AS meta_key,
metadata_ text.value AS value text.meta_ key = 'network_id' 0000-0000- 0000-0000000000 00') AS anon_1,
metadata_ text.id AS id,
metadata_ text.meta_ key AS meta_key,
metadata_ text.value AS value text.meta_ key = 'tenant_id' dbb990471dcf700 288') AS anon_2
meter.unit AS meter_unit,
min(
max(
count(
max(
sum(
avg(
min(
sample.
FROM meter,
sample,
(SELECT
FROM metadata_text
WHERE metadata_
AND metadata_text.value = '00000000-
(SELECT
FROM metadata_text
WHERE metadata_
AND metadata_text.value = '49ea53c44f8340
WHERE meter.id = sample.meter_id
AND meter.name = 'port'
AND sample.timestamp >= '1400364000'
AND sample.timestamp < '1400436093'
AND sample.id = anon_1.id
AND sample.id = anon_2.id
GROUP BY sample.resource_id;
-- 494 rows in set (6 min 12.59 sec)
After manually rewriting the subselects to joins:
SELECT sample. timestamp) AS tsmin, sample. timestamp) AS tsmax, sample. volume) AS count, sample. volume) AS max, sample. volume) AS sum, sample. volume) AS avg, sample. volume) AS min, resource_ id AS sample_resource_id 0000-0000- 0000-0000000000 00' dbb990471dcf700 288'
meter.unit AS meter_unit,
min(
max(
count(
max(
sum(
avg(
min(
sample.
FROM meter
INNER JOIN sample on (meter.id = sample.meter_id)
INNER JOIN metadata_text mtn on (mtn.id = sample.id)
INNER JOIN metadata_text mtt on (mtt.id = sample.id)
WHERE mtn.meta_key = 'network_id'
AND mtn.value = '00000000-
AND mtt.meta_key = 'tenant_id'
AND mtt.value = '49ea53c44f8340
AND meter.name = 'port'
AND sample.timestamp >= '1400364000'
AND sample.timestamp < '1400436093'
GROUP BY sample.resource_id;
-- 494 rows in set (0.06 sec)