Re: Performance Issue on Large Table

"R.Smith" <[email protected]> Sun, 23 Feb 2020 22:06:54 +0200
Newsgroups gmane.comp.db.sqlite.general
Message-ID <[email protected]>
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

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