diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2015-07-19 13:35:27 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2015-07-21 23:08:38 +0200 |
commit | a33816f29af384708f1bdf4478f95017dd756796 (patch) | |
tree | 17a28bf4b4b48481dad406106e698b8ceca0079e | |
parent | 81135ae19c727df716d0c0945869462e75a53497 (diff) | |
download | tracker-a33816f29af384708f1bdf4478f95017dd756796.tar.gz |
libtracker-data: Don't schedule all deletes only because of FTS
The limitations in FTS why it made sense to perform the scheduled
delete no longer apply since FTS4 and external content tables
(or rather, we don't need the previous values explicitly).
The scheduled delete is a lot more (if not extremely) thorough,
decomposing the properties and items to be deleted into individual
queries. This has quite an effect on deletes involving a large
number of elements, a query like
delete { ?u a rdfs:Resource; }
where { ?u nie:url ?url .
FILTER (fn:starts-with (?url, ".../linux/"))}
on a linux git checkout indexed through tracker-miner-fs used
to involve 7M sqlite queries, with this fast path it's down to
1.6M (and infinitely less sqlite3_stmt cache misses). In result
the timing is improved substantially, time(1) from that query
on the "tracker sparql" command went from:
real 2m33.377s
user 0m0.021s
sys 0m0.008s
Down to:
real 1m23.625s
user 0m0.021s
sys 0m0.009s
-rw-r--r-- | src/libtracker-data/tracker-data-update.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c index 694cf6719..a83036bc1 100644 --- a/src/libtracker-data/tracker-data-update.c +++ b/src/libtracker-data/tracker-data-update.c @@ -2068,9 +2068,11 @@ cache_delete_resource_type_full (TrackerClass *class, iface = tracker_db_manager_get_db_interface (); if (!single_type) { - if (!HAVE_TRACKER_FTS && - strcmp (tracker_class_get_uri (class), TRACKER_PREFIX_RDFS "Resource") == 0 && + if (strcmp (tracker_class_get_uri (class), TRACKER_PREFIX_RDFS "Resource") == 0 && g_hash_table_size (resource_buffer->tables) == 0) { +#if HAVE_TRACKER_FTS + tracker_db_interface_sqlite_fts_delete_id (iface, resource_buffer->id); +#endif /* skip subclass query when deleting whole resource to improve performance */ @@ -2134,9 +2136,8 @@ cache_delete_resource_type_full (TrackerClass *class, } } - /* bypass buffer if possible - we need old property values with FTS */ - direct_delete = (!HAVE_TRACKER_FTS && g_hash_table_size (resource_buffer->tables) == 0); + /* bypass buffer if possible */ + direct_delete = g_hash_table_size (resource_buffer->tables) == 0; /* delete all property values */ |