|
| 1 | +/* Copyright 2022 The Matrix.org Foundation C.I.C |
| 2 | + * |
| 3 | + * Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 | + * you may not use this file except in compliance with the License. |
| 5 | + * You may obtain a copy of the License at |
| 6 | + * |
| 7 | + * http://www.apache.org/licenses/LICENSE-2.0 |
| 8 | + * |
| 9 | + * Unless required by applicable law or agreed to in writing, software |
| 10 | + * distributed under the License is distributed on an "AS IS" BASIS, |
| 11 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 | + * See the License for the specific language governing permissions and |
| 13 | + * limitations under the License. |
| 14 | + */ |
| 15 | + |
| 16 | + |
| 17 | +-- By default the postgres statistics collector massively underestimates the |
| 18 | +-- number of distinct rooms in `event_search`, which can cause postgres to use |
| 19 | +-- table scans for queries for multiple rooms. |
| 20 | +-- |
| 21 | +-- To work around this we can manually tell postgres the number of distinct rooms |
| 22 | +-- by setting `n_distinct` (a negative value here is the number of distinct values |
| 23 | +-- divided by the number of rows, so -0.01 means on average there are 100 rows per |
| 24 | +-- distinct value). We don't need a particularly accurate number here, as a) we just |
| 25 | +-- want it to always use index scans and b) our estimate is going to be better than the |
| 26 | +-- one made by the statistics collector. |
| 27 | + |
| 28 | +ALTER TABLE event_search ALTER COLUMN room_id SET (n_distinct = -0.01); |
| 29 | + |
| 30 | +-- Ideally we'd do an `ANALYZE event_search (room_id)` here so that |
| 31 | +-- the above gets picked up immediately, but that can take a bit of time so we |
| 32 | +-- rely on the autovacuum eventually getting run and doing that in the |
| 33 | +-- background for us. |
0 commit comments