summaryrefslogtreecommitdiff
path: root/src/channel/repo.rs
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2024-10-23 00:31:53 -0400
committerOwen Jacobson <owen@grimoire.ca>2024-10-23 00:42:00 -0400
commit3fab58827017041168a769184469cff3722d6c38 (patch)
tree043b49c36976a1eec8fe4306a1e88d3cc2a27e62 /src/channel/repo.rs
parent6f7f4410980edd13c57ad54697ebe99d739fef76 (diff)
Make sure (most) queries avoid table scans.
I've exempted inserts (they never scan in the first place), queries on `event_sequence` (at most one row), and the coalesce()s used for event replay (for now; these are obviously a performance risk area and need addressing). Method: ``` find .sqlx -name 'query-*.json' -exec jq -r '"explain query plan " + .query + ";"' {} + > explain.sql ``` Then go query by query through the resulting file.
Diffstat (limited to 'src/channel/repo.rs')
-rw-r--r--src/channel/repo.rs14
1 files changed, 7 insertions, 7 deletions
diff --git a/src/channel/repo.rs b/src/channel/repo.rs
index e26ac2b..a49db52 100644
--- a/src/channel/repo.rs
+++ b/src/channel/repo.rs
@@ -104,13 +104,13 @@ impl<'c> Channels<'c> {
Ok(channel)
}
- pub async fn all(&mut self, resume_at: ResumePoint) -> Result<Vec<History>, LoadError> {
+ pub async fn all(&mut self, resume_at: Sequence) -> Result<Vec<History>, LoadError> {
let channels = sqlx::query!(
r#"
select
id as "id: Id",
- name.display_name as "display_name: String",
- name.canonical_name as "canonical_name: String",
+ name.display_name as "display_name?: String",
+ name.canonical_name as "canonical_name?: String",
channel.created_at as "created_at: DateTime",
channel.created_sequence as "created_sequence: Sequence",
deleted.deleted_at as "deleted_at?: DateTime",
@@ -120,7 +120,7 @@ impl<'c> Channels<'c> {
using (id)
left join channel_deleted as deleted
using (id)
- where coalesce(channel.created_sequence <= $1, true)
+ where channel.created_sequence <= $1
order by name.canonical_name
"#,
resume_at,
@@ -144,7 +144,7 @@ impl<'c> Channels<'c> {
Ok(channels)
}
- pub async fn replay(&mut self, resume_at: Option<Sequence>) -> Result<Vec<History>, LoadError> {
+ pub async fn replay(&mut self, resume_at: ResumePoint) -> Result<Vec<History>, LoadError> {
let channels = sqlx::query!(
r#"
select
@@ -263,8 +263,8 @@ impl<'c> Channels<'c> {
r#"
select
channel.id as "id: Id",
- name.display_name as "display_name: String",
- name.canonical_name as "canonical_name: String",
+ name.display_name as "display_name?: String",
+ name.canonical_name as "canonical_name?: String",
channel.created_at as "created_at: DateTime",
channel.created_sequence as "created_sequence: Sequence",
deleted.deleted_at as "deleted_at?: DateTime",