On Wed, Apr 20, 2011 at 12:37 AM, Kenneth Ballard < kball...@kennethballard.com> wrote:
> Okay I'm going to just give up on creating a specific test case for this > one and I'm just attaching the original database file. Every time I tried to > isolate out just the tables applicable to the trigger code, the issue is not > reproducible. So attached to this message is the database in question with > data. > This mailing list strips attachments. Why don't you email the database directly to me at d...@sqlite.org? > > To reproduce the issue, merely execute this query: > > DELETE FROM age WHERE island = ?; > > where ? is one of the values in the table -- 140 will likely provide the > largest wait time. However, if you execute the trigger's code as a > stand-alone query, it executes almost instantly. > > DELETE FROM offers > WHERE shoppe_id IN > (SELECT id FROM shoppes WHERE island = ?); > > where ? is the same island id you use in the previous query. > > So until this is figured out, I guess my application code is going to have > to execute the queries separately -- not a huge deal, but the trigger > simplifies the application code a little. Let me know if you have any luck > reproducing the issue. > > Kenneth > > > On 4/16/2011 8:09 PM, Richard Hipp wrote: > >> On Sat, Apr 16, 2011 at 6:29 PM, Kenneth Ballard< >> kball...@kennethballard.com> wrote: >> >> The schema for these two tables is unchanged between the 3.7.5 and 3.7.6 >>> version with the exception of the sort modifiers on table_b's unique >>> index. >>> >>> Using the schema and sqlite_stat1 data you provide, I get identical >> query >> plans for 3.7.5 and 3.7.6.1. So I do not know what might have changed. >> Can >> you put together a reasonably sized test case that demonstrates the >> performance regression? >> >> >> >> Table table_b: >>> >>> CREATE TABLE [table_b] ( >>> [col_a] INTEGER NOT NULL CONSTRAINT [fk_tableb_tablec] REFERENCES >>> [tablec]([col_a]) ON DELETE CASCADE, >>> [col_b] INTEGER NOT NULL CONSTRAINT [fk_tableb_tabled] REFERENCES >>> [tabled]([col_a]) ON DELETE CASCADE, >>> [col_c] INTEGER, >>> [col_d] INTEGER, >>> [col_e] INTEGER, >>> [col_f] INTEGER, >>> CONSTRAINT [VALID_OFFER] CHECK(((col_c IS NOT NULL AND col_c> 0) AND >>> (col_d IS NOT NULL AND col_d>= 0)) >>> OR >>> ((col_e IS NOT NULL AND col_e> 0) AND (col_f IS NOT NULL AND col_f>= >>> 0)))); >>> >>> CREATE UNIQUE INDEX [idx_tableb_tablec_tabled] ON [table_b] ([col_b] >>> ASC, [col_a] ASC); >>> >>> Table table_c: >>> >>> CREATE TABLE [table_c] ( >>> [col_a] INTEGER NOT NULL PRIMARY KEY, >>> [col_b] INTEGER NOT NULL CONSTRAINT [fk_tablec_tablee] REFERENCES >>> [table_e]([col_a]), >>> [col_c] TEXT NOT NULL); >>> >>> And the sqlite_stat1 table data: >>> >>> table_a,<null>,1 >>> table_b,idx_tableb_tablec_tabled,6745 42 1 >>> table_c,<null>974 >>> >>> >>> On 4/16/2011 4:35 PM, Kenneth Ballard wrote: >>> >>>> Good afternoon, >>>> >>>> Here is an issue I started to experience after upgrading from SQLite >>>> 3.7.5 to 3.7.6 involving a trigger I have on a database table. >>>> >>>> The table with the trigger is a 2-column table with the following >>>> trigger installed to it: >>>> >>>> CREATE TABLE [table_a] ( >>>> [col_a] INTEGER NOT NULL PRIMARY KEY, >>>> [col_b] INT64 NOT NULL); >>>> >>>> CREATE TRIGGER [RemoveOffers] >>>> BEFORE DELETE >>>> ON [table_a] >>>> BEGIN >>>> DELETE FROM table_b >>>> WHERE col_a IN >>>> (SELECT col_a FROM table_c WHERE col_b = old.col_a); >>>> END; >>>> >>>> On 3.7.5, a single delete statement from this table executed almost >>>> instantaneously even on the largest sets of data it would be clearing >>>> out. However, after upgrading to 3.7.6 and 3.7.6.1, this isn't the case. >>>> To have the same performance as I did on 3.7.5, I have to use the >>>> trigger query separately -- a delete statement on table_a and the delete >>>> statement on table_b separately. >>>> >>>> Again, as a trigger this statement takes seconds to run -- one run took >>>> as much as 15 seconds to execute. As separate delete statements, it >>>> takes a fraction of a second, similar to how it ran as a trigger in >>>> >>> 3.7.5. >>> >>>> I've also noticed issues where queries with an IN clause (like the >>>> trigger above) took significantly longer to execute than before, but >>>> that was cleared up by adding some more indexes to the table >>>> definitions. But even adding additional indexes didn't help the >>>> performance of this trigger running as a trigger. >>>> >>>> So this begs the question: what changed? >>>> >>>> _______________________________________________ >>>> sqlite-users mailing list >>>> sqlite-users@sqlite.org >>>> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users >>>> >>>> _______________________________________________ >>> sqlite-users mailing list >>> sqlite-users@sqlite.org >>> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users >>> >>> >> >> > > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users > > -- D. Richard Hipp d...@sqlite.org _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users