On Sun, May 25, 2014 at 4:22 PM, Andrew Arnott <[email protected]>wrote:
> It isn't clear why the slow one would be so much slower. In my naïve
> opinion the query analyze in SQLite should recognize and treat these two as
> the same but obviously the execution strategy is vastly different. Is there
> an opportunity here to optimize SQLite for the slow query form?
>
> var slow = await this.Database.QueryAsync<Entities.Message>(@"
> SELECT m.Id FROM Message m
> WHERE m.RemoteContactId = ? AND (
> SELECT COUNT(Id) FROM Attachment a
> WHERE a.MessageId = m.Id
> ) > 0", new object[] { this.RemoteParty.Id });
>
I suspect the problem with the slow one is that the subquery has to be
re-run and count the matching rows for every matching RemoteContactId. You
might be able to speed it up with a simple "LIMIT 1" in the sub-query, like
so: (SELECT COUNT(Id) FROM Attachment a WHERE a.MessageId = m.Id LIMIT 1).
Since you only care if the number is greater than zero, 1 will do just as
well as any other non-zero number.
SDR
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users