summaryrefslogtreecommitdiff
path: root/src/message
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/message
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/message')
-rw-r--r--src/message/repo.rs16
1 files changed, 7 insertions, 9 deletions
diff --git a/src/message/repo.rs b/src/message/repo.rs
index 4cfefec..c8ceceb 100644
--- a/src/message/repo.rs
+++ b/src/message/repo.rs
@@ -79,8 +79,8 @@ impl<'c> Messages<'c> {
message.body as "body: Body",
message.sent_at as "sent_at: DateTime",
message.sent_sequence as "sent_sequence: Sequence",
- deleted.deleted_at as "deleted_at: DateTime",
- deleted.deleted_sequence as "deleted_sequence: Sequence"
+ deleted.deleted_at as "deleted_at?: DateTime",
+ deleted.deleted_sequence as "deleted_sequence?: Sequence"
from message
left join message_deleted as deleted
using (id)
@@ -186,33 +186,31 @@ impl<'c> Messages<'c> {
) -> Result<History, sqlx::Error> {
let id = message.id();
- sqlx::query_scalar!(
+ sqlx::query!(
r#"
insert into message_deleted (id, deleted_at, deleted_sequence)
values ($1, $2, $3)
- returning 1 as "deleted: bool"
"#,
id,
deleted.at,
deleted.sequence,
)
- .fetch_one(&mut *self.0)
+ .execute(&mut *self.0)
.await?;
// Small social responsibility hack here: when a message is deleted, its body is
// retconned to have been the empty string. Someone reading the event stream
// afterwards, or looking at messages in the channel, cannot retrieve the
// "deleted" message by ignoring the deletion event.
- sqlx::query_scalar!(
+ sqlx::query!(
r#"
update message
- set body = ""
+ set body = ''
where id = $1
- returning 1 as "blanked: bool"
"#,
id,
)
- .fetch_one(&mut *self.0)
+ .execute(&mut *self.0)
.await?;
let message = self.by_id(id).await?;