Here’s thinking out of the box --- have you thought of doing away with the “history” table entirely? A properly indexed and tuned database should hold, retrieve and update several million rows of historical data without sweating. Now the question would be, “Well, how do I retrieve the most current record set?” If you have a date/time stamp and primary key in every table you can couple that with SQL functions like MAX and RANK which should answer your need to retrieve just the most current record set.
The other option is to rewrite your TRIGGERS into STORED PROCEDURES. Your “transaction” (table where you keep your current data) would more than likely be identical in structure to your history table, then it’s just a matter of rewriting your STORED PROCEDURES to work with your “history” table. The advantage of course is that all your cascading updates and deletes will work and more importantly you can easily ROLLBACK your transactions in your STORED PROCEDURES.
I hope this gives you an added perspective on how to address this issue from a different angle.
Arles