Re: Performance Issue on Large Table

Richard Damon <[email protected]> Sun, 23 Feb 2020 21:38:10 -0500
Newsgroups gmane.comp.db.sqlite.general
Message-ID <[email protected]>
On 2/23/20 3:06 PM, R.Smith wrote:
>
> On 2020/02/23 21:23, Richard Damon wrote:
>> On 2/23/20 8:31 AM, Olaf Schmidt wrote:
>>>
>>> An amount of 140 tables in such a "BibleVersions.db" is not
>>> uncommon and can be managed by SQLite in a good performance.
>>
>> I'm not sure that form of division would be good. One basic rule of 
>> database normalization is that you don't break-up data based on the 
>> value of one of the fields because you can't make the table to lookup 
>> data from be taken from a field you get in a query.
>>
>
> It is far less of a worse design than having an AFTER DELETE trigger 
> doing trivial processing when you expect to delete 30K records at a 
> time due to a "well-designed" 1NF schema.
>
> Firstly, good design guides are only guides.
> Secondly, having said that, either embrace the full idealism or none 
> of it, but doing some things the good way and others not, hampers the 
> "goodness" of the overall system.
> Lastly, we usually use ON DELETE CASCADE Foreign Key relations to do 
> what you are doing with the trigger, but of course you are using FTS5 
> and I do not know if it can be done the FK way, or indeed how much the 
> FK way will be better considering the same Indexes remain.
>
>
> Note - I don't have a good solution here, if it was me I would 
> immediately kill those triggers, see if it can be done smarter (or is 
> needed at all), or even if it can be done in code - OR - get rid of 
> the 1NF schema and go with the suggested Bible-per-Table method and 
> keep the triggers (This will help nothing if the deletes are going to 
> require deleting 1 record (and its trigger) each through 30K tables. 
> It's only useful if it brings down the delete count).
>
> If you cannot live without the triggers, nor can bring down the 
> delete-count, maybe do it in code, or one quick way I can think of is 
> using the ON DELETE to add those IDs to a "to_be_deleted" table and 
> simply delete everything fropm the second table with "WHERE ID IN 
> (SELECT ID FROM to_be_deleted)" before comitting the transaction, 
> perhaps combined with dropping and re-making the Indexes - but of 
> course this needs testing and might not be suitable for reasons I am 
> unaware of in your use case.
>
>
> Either way, you are probably in for some lengthy processing.
>
> Best of luck!
> Ryan 

My thought is that a modification (making multiple tables, one per 
version) that drops significant functionality (now version is hard coded 
as part of the query, and can't be determined as part of a query) is 
something not to lightly do.  It also isn't that likely to improve 
things a lot unless it allows the massive delete cycle to be replaced 
with a drop table.

One big question is why the apparent wholesale deletion of a version, 
and if really needed perhaps a better schema that supports the 
operations better.

-- 
Richard Damon

_______________________________________________
sqlite-users mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users