core: optimize member subscriptions query (#6320)

* core: optimize member subscriptions query

* Revert "core: optimize member subscriptions query"

This reverts commit a056cca6cc.

* with materialized

* plans
This commit is contained in:
spaced4ndy
2025-09-30 15:40:59 +00:00
committed by GitHub
parent a7869d3ab1
commit acae5af0ad
3 changed files with 69 additions and 48 deletions
+15 -12
View File
@@ -276,26 +276,29 @@ getMemberConnsToSub db User {userId, userContactId} filterToSubscribe =
DB.query
db
query
((userId, ConnDeleted, userContactId)
:. (GSMemRemoved, GSMemLeft, GSMemGroupDeleted, GSMemRemoved, GSMemLeft, GSMemGroupDeleted))
((userId, userContactId, GSMemRemoved, GSMemLeft, GSMemGroupDeleted)
:. (userId, ConnDeleted, GSMemRemoved, GSMemLeft, GSMemGroupDeleted))
where
query
| filterToSubscribe = baseQuery <> " AND c.to_subscribe = 1 " <> cond
| otherwise = baseQuery <> " " <> cond
| filterToSubscribe = baseQuery <> " AND c.to_subscribe = 1"
| otherwise = baseQuery
baseQuery =
[sql|
WITH user_groups AS MATERIALIZED (
SELECT g.group_id
FROM groups g
JOIN group_members mu ON mu.group_id = g.group_id
WHERE g.user_id = ?
AND mu.contact_id = ?
AND mu.member_status NOT IN (?,?,?)
)
SELECT c.agent_conn_id
FROM connections c
JOIN group_members m ON m.group_member_id = c.group_member_id
JOIN groups g ON g.group_id = m.group_id
JOIN group_members mu ON mu.group_id = g.group_id
JOIN user_groups ug ON ug.group_id = m.group_id
WHERE c.user_id = ?
|]
cond =
[sql|
AND c.conn_status != ?
AND mu.contact_id = ? AND mu.member_status NOT IN (?,?,?)
AND m.member_status NOT IN (?,?,?)
AND c.conn_status != ?
AND m.member_status NOT IN (?,?,?)
|]
getPendingConnsToSub :: DB.Connection -> User -> Bool -> IO [ConnId]
@@ -953,6 +953,10 @@ Plan:
Query: INSERT INTO xftp_servers (xftp_host, xftp_port, xftp_key_hash) VALUES (?,?,?)
Plan:
Query: SELECT 1 FROM connections WHERE conn_id = ? AND deleted_at_wait_delivery < ? LIMIT 1
Plan:
SEARCH connections USING PRIMARY KEY (conn_id=?)
Query: SELECT 1 FROM encrypted_rcv_message_hashes WHERE conn_id = ? AND hash = ? LIMIT 1
Plan:
SEARCH encrypted_rcv_message_hashes USING COVERING INDEX idx_encrypted_rcv_message_hashes_hash (conn_id=? AND hash=?)
@@ -3167,42 +3167,6 @@ Plan:
SEARCH c USING INDEX idx_connections_to_subscribe (user_id=? AND to_subscribe=?)
SEARCH ct USING INTEGER PRIMARY KEY (rowid=?)
Query:
SELECT c.agent_conn_id
FROM connections c
JOIN group_members m ON m.group_member_id = c.group_member_id
JOIN groups g ON g.group_id = m.group_id
JOIN group_members mu ON mu.group_id = g.group_id
WHERE c.user_id = ?
AND c.conn_status != ?
AND mu.contact_id = ? AND mu.member_status NOT IN (?,?,?)
AND m.member_status NOT IN (?,?,?)
Plan:
SEARCH c USING INDEX idx_connections_to_subscribe (user_id=?)
SEARCH m USING INTEGER PRIMARY KEY (rowid=?)
SEARCH g USING INTEGER PRIMARY KEY (rowid=?)
SEARCH mu USING INDEX sqlite_autoindex_group_members_1 (group_id=?)
Query:
SELECT c.agent_conn_id
FROM connections c
JOIN group_members m ON m.group_member_id = c.group_member_id
JOIN groups g ON g.group_id = m.group_id
JOIN group_members mu ON mu.group_id = g.group_id
WHERE c.user_id = ?
AND c.to_subscribe = 1
AND c.conn_status != ?
AND mu.contact_id = ? AND mu.member_status NOT IN (?,?,?)
AND m.member_status NOT IN (?,?,?)
Plan:
SEARCH c USING INDEX idx_connections_to_subscribe (user_id=? AND to_subscribe=?)
SEARCH m USING INTEGER PRIMARY KEY (rowid=?)
SEARCH g USING INTEGER PRIMARY KEY (rowid=?)
SEARCH mu USING INDEX sqlite_autoindex_group_members_1 (group_id=?)
Query:
SELECT c.agent_conn_id
FROM connections c
@@ -3884,6 +3848,56 @@ Query:
Plan:
SEARCH groups USING INTEGER PRIMARY KEY (rowid=?)
Query:
WITH user_groups AS MATERIALIZED (
SELECT g.group_id
FROM groups g
JOIN group_members mu ON mu.group_id = g.group_id
WHERE g.user_id = ?
AND mu.contact_id = ?
AND mu.member_status NOT IN (?,?,?)
)
SELECT c.agent_conn_id
FROM connections c
JOIN group_members m ON m.group_member_id = c.group_member_id
JOIN user_groups ug ON ug.group_id = m.group_id
WHERE c.user_id = ?
AND c.conn_status != ?
AND m.member_status NOT IN (?,?,?)
Plan:
MATERIALIZE user_groups
SEARCH mu USING INDEX idx_group_members_contact_id (contact_id=?)
SEARCH g USING INTEGER PRIMARY KEY (rowid=?)
SEARCH c USING INDEX idx_connections_to_subscribe (user_id=?)
SEARCH m USING INTEGER PRIMARY KEY (rowid=?)
SEARCH ug USING AUTOMATIC COVERING INDEX (group_id=?)
Query:
WITH user_groups AS MATERIALIZED (
SELECT g.group_id
FROM groups g
JOIN group_members mu ON mu.group_id = g.group_id
WHERE g.user_id = ?
AND mu.contact_id = ?
AND mu.member_status NOT IN (?,?,?)
)
SELECT c.agent_conn_id
FROM connections c
JOIN group_members m ON m.group_member_id = c.group_member_id
JOIN user_groups ug ON ug.group_id = m.group_id
WHERE c.user_id = ?
AND c.conn_status != ?
AND m.member_status NOT IN (?,?,?)
AND c.to_subscribe = 1
Plan:
MATERIALIZE user_groups
SEARCH mu USING INDEX idx_group_members_contact_id (contact_id=?)
SEARCH g USING INTEGER PRIMARY KEY (rowid=?)
SEARCH c USING INDEX idx_connections_to_subscribe (user_id=? AND to_subscribe=?)
SEARCH m USING INTEGER PRIMARY KEY (rowid=?)
SEARCH ug USING AUTOMATIC COVERING INDEX (group_id=?)
Query:
DELETE FROM chat_items
WHERE group_scope_group_member_id = ?