From 3ffb37270d0826729274fddb05284ccc531e102e Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Sat, 2 May 2020 13:30:13 +1000 Subject: [PATCH] add partial index on odid, and search odid as well the odid != 0 check in cards_for_deck.sql is necessary for sqlite to be able to take advantage of the index --- rslib/src/decks/mod.rs | 2 -- rslib/src/storage/deck/cards_for_deck.sql | 9 +++++++++ rslib/src/storage/deck/mod.rs | 2 +- rslib/src/storage/upgrades/schema11_downgrade.sql | 1 + rslib/src/storage/upgrades/schema15_upgrade.sql | 3 +++ 5 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 rslib/src/storage/deck/cards_for_deck.sql diff --git a/rslib/src/decks/mod.rs b/rslib/src/decks/mod.rs index 03d447c5c..ae907d3dd 100644 --- a/rslib/src/decks/mod.rs +++ b/rslib/src/decks/mod.rs @@ -366,8 +366,6 @@ impl Collection { } fn delete_all_cards_in_normal_deck(&mut self, did: DeckID) -> Result<()> { - // fixme: need to search on odid as well - // fixme: the odid requirement will require a table scan, which will be slow when deleting a large tree let cids = self.storage.all_cards_in_single_deck(did)?; self.remove_cards_inner(&cids) } diff --git a/rslib/src/storage/deck/cards_for_deck.sql b/rslib/src/storage/deck/cards_for_deck.sql new file mode 100644 index 000000000..6c9cfb1f3 --- /dev/null +++ b/rslib/src/storage/deck/cards_for_deck.sql @@ -0,0 +1,9 @@ +select + id +from cards +where + did = ?1 + or ( + odid != 0 + and odid = ?1 + ) \ No newline at end of file diff --git a/rslib/src/storage/deck/mod.rs b/rslib/src/storage/deck/mod.rs index 11c49ce7e..89cbbc011 100644 --- a/rslib/src/storage/deck/mod.rs +++ b/rslib/src/storage/deck/mod.rs @@ -117,7 +117,7 @@ impl SqliteStorage { pub(crate) fn all_cards_in_single_deck(&self, did: DeckID) -> Result> { self.db - .prepare_cached("select id from cards where did = ?")? + .prepare_cached(include_str!("cards_for_deck.sql"))? .query_and_then(&[did], |r| r.get(0).map_err(Into::into))? .collect() } diff --git a/rslib/src/storage/upgrades/schema11_downgrade.sql b/rslib/src/storage/upgrades/schema11_downgrade.sql index 14bacf26c..ec1bd7713 100644 --- a/rslib/src/storage/upgrades/schema11_downgrade.sql +++ b/rslib/src/storage/upgrades/schema11_downgrade.sql @@ -5,6 +5,7 @@ drop table fields; drop table templates; drop table notetypes; drop table decks; +drop index idx_cards_odid; update col set ver = 11; \ No newline at end of file diff --git a/rslib/src/storage/upgrades/schema15_upgrade.sql b/rslib/src/storage/upgrades/schema15_upgrade.sql index c8bb2ce0d..084dd9be1 100644 --- a/rslib/src/storage/upgrades/schema15_upgrade.sql +++ b/rslib/src/storage/upgrades/schema15_upgrade.sql @@ -35,6 +35,9 @@ create table decks ( kind bytes not null ); create unique index idx_decks_id on decks (id); +create index idx_cards_odid on cards (odid) +where + odid != 0; update col set ver = 15;