GNOME Bugzilla – Bug 662561
Queries on smart playlist tables take too long
Last modified: 2011-10-24 00:56:16 UTC
Banshee has become basically unusable due to a few sql operations taking 70-160 seconds each. Generally hangs when fetching next track to play after one completes...or when syncing a device Two examples I found: [4 Debug 18:05:11.586] Executed in 70871ms SELECT COUNT(*), SUM(CoreTracks.FileSize), SUM(CoreTracks.Duration) FROM CoreTracks CROSS JOIN CoreArtists,CoreAlbums, CoreSmartPlaylistEntries WHERE CoreArtists.ArtistID = CoreTracks.ArtistID AND CoreAlbums.AlbumID = CoreTracks.AlbumID AND CoreSmartPlaylistEntries.TrackID = CoreTracks.TrackID AND CoreSmartPlaylistEntries.SmartPlaylistID = 1 sqlite> explain SELECT COUNT(*), SUM(CoreTracks.FileSize), SUM(CoreTracks.Duration) FROM CoreTracks CROSS JOIN CoreArtists,CoreAlbums, CoreSmartPlaylistEntries WHERE CoreArtists.ArtistID = CoreTracks.ArtistID AND CoreAlbums.AlbumID = CoreTracks.AlbumID AND CoreSmartPlaylistEntries.TrackID = CoreTracks.TrackID AND CoreSmartPlaylistEntries.SmartPlaylistID = 1; addr|opcode|p1|p2|p3|p4|p5|comment 0|Trace|0|0|0||00| 1|Null|0|4|0||00| 2|Null|0|5|0||00| 3|Null|0|1|0||00| 4|Null|0|2|0||00| 5|Null|0|3|0||00| 6|Integer|1|6|0||00| 7|Goto|0|44|0||00| 8|OpenRead|0|5|0|24|00| 9|OpenRead|1|11|0|0|00| 10|OpenRead|3|18|0|3|00| 11|OpenRead|2|8|0|0|00| 12|Rewind|0|32|0||00| 13|Column|0|2|7||00| 14|MustBeInt|7|31|0||00| 15|NotExists|1|31|7||00| 16|Rewind|3|31|0||00| 17|Column|3|2|8||00| 18|Rowid|0|9|0||00| 19|Ne|9|30|8|collseq(BINARY)|6b| 20|Column|3|1|10||00| 21|Ne|6|30|10|collseq(BINARY)|6c| 22|Column|0|3|11||00| 23|MustBeInt|11|30|0||00| 24|NotExists|2|30|11||00| 25|AggStep|0|0|1|count(0)|00| 26|Column|0|9|12||00| 27|AggStep|0|12|2|sum(1)|01| 28|Column|0|23|12||00| 29|AggStep|0|12|3|sum(1)|01| 30|Next|3|17|0||01| 31|Next|0|13|0||01| 32|Close|0|0|0||00| 33|Close|1|0|0||00| 34|Close|3|0|0||00| 35|Close|2|0|0||00| 36|AggFinal|1|0|0|count(0)|00| 37|AggFinal|2|1|0|sum(1)|00| 38|AggFinal|3|1|0|sum(1)|00| 39|Copy|1|13|0||00| 40|Copy|2|14|0||00| 41|Copy|3|15|0||00| 42|ResultRow|13|3|0||00| 43|Halt|0|0|0||00| 44|Transaction|0|0|0||00| 45|VerifyCookie|0|56|0||00| 46|TableLock|0|5|0|CoreTracks|00| 47|TableLock|0|11|0|CoreArtists|00| 48|TableLock|0|18|0|CoreSmartPlaylistEntries|00| 49|TableLock|0|8|0|CoreAlbums|00| 50|Goto|0|8|0||00| [4 Debug 18:06:22.866] Executed in 71263ms DELETE FROM CoreCache WHERE ModelID = 7; INSERT INTO CoreCache (ModelID, ItemID) SELECT 7, CoreTracks.TrackID FROM CoreTracks CROSS JOIN CoreArtists,CoreAlbums, CoreSmartPlaylistEntries WHERE CoreArtists.ArtistID = CoreTracks.ArtistID AND CoreAlbums.AlbumID = CoreTracks.AlbumID AND CoreSmartPlaylistEntries.TrackID = CoreTracks.TrackID AND CoreSmartPlaylistEntries.SmartPlaylistID = 1 ORDER BY CoreArtists.NameSortKey ASC, CoreTracks.Year ASC, CoreAlbums.TitleSortKey ASC, CoreTracks.Disc ASC, CoreTracks.TrackNumber ASC sqlite> explain select * from CoreCache where ModelID=7; Error: no such table: CoreCache sqlite> explain SELECT 7, CoreTracks.TrackID FROM CoreTracks CROSS JOIN CoreArtists,CoreAlbums, CoreSmartPlaylistEntries WHERE CoreArtists.ArtistID = CoreTracks.ArtistID AND CoreAlbums.AlbumID = CoreTracks.AlbumID AND CoreSmartPlaylistEntries.TrackID = CoreTracks.TrackID AND CoreSmartPlaylistEntries.SmartPlaylistID = 1 ORDER BY ...> CoreArtists.NameSortKey ASC, ...> CoreTracks.Year ASC, ...> CoreAlbums.TitleSortKey ASC, ...> CoreTracks.Disc ASC, ...> CoreTracks.TrackNumber ASC; addr|opcode|p1|p2|p3|p4|p5|comment 0|Trace|0|0|0||00| 1|OpenEphemeral|4|7|0|keyinfo(5,BINARY,BINARY)|00| 2|Integer|1|1|0||00| 3|Goto|0|48|0||00| 4|OpenRead|0|5|0|25|00| 5|OpenRead|1|11|0|7|00| 6|OpenRead|3|18|0|3|00| 7|OpenRead|2|8|0|8|00| 8|Rewind|0|35|0||00| 9|Column|0|2|2||00| 10|MustBeInt|2|34|0||00| 11|NotExists|1|34|2||00| 12|Rewind|3|34|0||00| 13|Column|3|2|3||00| 14|Rowid|0|4|0||00| 15|Ne|4|33|3|collseq(BINARY)|6b| 16|Column|3|1|5||00| 17|Ne|1|33|5|collseq(BINARY)|6c| 18|Column|0|3|6||00| 19|MustBeInt|6|33|0||00| 20|NotExists|2|33|6||00| 21|Integer|7|7|0||00| 22|Rowid|0|8|0||00| 23|MakeRecord|7|2|6||00| 24|Column|1|6|9||00| 25|Column|0|24|10||00| 26|Column|2|7|11||00| 27|Column|0|21|12||00| 28|Column|0|19|13||00| 29|Sequence|4|14|0||00| 30|Move|6|15|1||00| 31|MakeRecord|9|7|5||00| 32|IdxInsert|4|5|0||00| 33|Next|3|13|0||01| 34|Next|0|9|0||01| 35|Close|0|0|0||00| 36|Close|1|0|0||00| 37|Close|3|0|0||00| 38|Close|2|0|0||00| 39|OpenPseudo|5|6|2||00| 40|Sort|4|46|0||00| 41|Column|4|6|6||00| 42|Column|5|0|7||20| 43|Column|5|1|8||00| 44|ResultRow|7|2|0||00| 45|Next|4|41|0||00| 46|Close|5|0|0||00| 47|Halt|0|0|0||00| 48|Transaction|0|0|0||00| 49|VerifyCookie|0|56|0||00| 50|TableLock|0|5|0|CoreTracks|00| 51|TableLock|0|11|0|CoreArtists|00| 52|TableLock|0|18|0|CoreSmartPlaylistEntries|00| 53|TableLock|0|8|0|CoreAlbums|00| 54|Goto|0|4|0||00| I tried emptying the smartplaylists and smartplaylistentries tables, but it repopulates them automatically. I don't actually have any smart playlists, but the system ones exist sqlite> select * from CoreSmartPlaylists; PrimarySourceID|SmartPlaylistID|Name|Condition|OrderBy|LimitNumber|LimitCriterion|CachedCount|IsTemporary|IsHiddenWhenEmpty 1|1|sync_list||||||1|0 1|2|to_add||||||1|0 15|3|to_remove|||||0|1|0 2|4|sync_list|||||0|1|0 2|5|to_add|<request><query banshee-version="1"><equals><field name="smartplaylistid" /><int>4</int></equals></query></request>||||0|1|0 15|6|to_remove|||||0|1|0 15|7|Music|||||0|0|0 15|8|Videos|||||0|0|0 15|9|Podcasts|||||0|0|0 sqlite> select count(*) from CoreSmartPlaylistEntries; count(*) 37448 This has only happened since I ran some recent updates. Banshee will not let me roll back to an earlier sqlite (2.x or so) to test as sqlite3 is a dependency. using libsqlite3-0 v 3.7.7-2ubuntu2
Thanks for the bug report. This particular bug has already been reported into our bug tracking system, but please feel free to report any further bugs you find. *** This bug has been marked as a duplicate of bug 648592 ***