Reputation: 26981
Twice a day, I run a heavy query and save the results (40MBs worth of rows) to a table.
I truncate this results table before inserting the new results such that it only ever has the latest query's results in it.
The problem, is that while the update to the table is written, there is technically no data and/or a lock. When that is the case, anyone interacting with the site could experience an interruption. I haven't experienced this yet, but I am looking to mitigate this in the future.
What is the best way to remedy this? Is it proper to write the new results to a table named results_pending
, then drop the results
table and rename results_pending
to results
?
Upvotes: 2
Views: 1120
Reputation: 7299
TRUNCATE
is a DDL operation which causes problems like this. If you are using snapshot isolation with row versioning and want users to either see the old or new data then use a single transaction to DELETE
the old records and INSERT
the new data.
Another option if a lot of the data doesn't actually change is to UPDATE
/ INSERT
/ DELETE
only those records that need it and leave unchanged records alone.
Upvotes: 1
Reputation: 1270431
Two methods come to mind. One is to swap partitions for the table. To be honest, I haven't done this in SQL Server, but it should work at a low level.
I would normally have all access go through a view. Then, I would create the new day's data in a separate table -- and change the view to point to the new table. The view change is close to "atomic". Well, actually, there is a small period of time when the view might not be available.
Then, at your leisure you can drop the old version of the table.
Upvotes: 2