> On Nov 29, 2017, at 9:06 AM, Scott Ahten <
lightand...@gmail.com> wrote:
>
> I'm starting to run into performance issues on a iOS 1.4 CBL app with a very large number of documents (+30k). It seems that indexing is blocking queries and, in turn, blocking specific tasks.
Hopefully 1.4.1 helps — there’s a SQLite query optimizer bug that we had to work around.
> First, drastically reduce the number of views to reduce the amount of indexing work.
Also, if you have related views (that will be queried at similar times, like by the same controller) give them names starting with a common prefix and a slash, like “detail/byName” and “detail/byDate”. The indexer uses that as a clue that it should index those views at the same time, i.e. if it’s indexing one it will index the other(s) too.
And try to optimize the code in your map block. It gets called many times, so small time savings add up. Don’t pull the same property out of the document dictionary twice; keep it in a local variable. Try to avoid parsing dates. Stuff like that.
It’s also possible to query a view without updating the index, if you’re OK with getting stale data.
> Second, try and keep indexes up to date by setting up a live queries, returning only one row, that reference the remaining views.
You can also directly update the index in the background by calling -[CBLView updateIndexAsync:]. This will run on the background thread and db connection that are used by the replicator.
> When setting up a second connection, is it necessary to define map/reduce blocks for each database connection that points to the same file?
Yes; any CBLDatabases on the same file need to have the same map functions set up.
> Also, what determines where indexing work is performed?
Views are usually indexed lazily, when queried. If you query a view and its index isn’t up-to-date, the indexer will run and scan the revisions that have been added since it was last indexed. But it’s also possible to index a view manually as I showed above.
—Jens