summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2015-07-19 13:35:27 +0200
committerCarlos Garnacho <carlosg@gnome.org>2015-07-21 23:08:38 +0200
commita33816f29af384708f1bdf4478f95017dd756796 (patch)
tree17a28bf4b4b48481dad406106e698b8ceca0079e
parent81135ae19c727df716d0c0945869462e75a53497 (diff)
downloadtracker-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.c11
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 */