CoreStore icon indicating copy to clipboard operation
CoreStore copied to clipboard

Slow DB Performance - DataStack childTransactionQueue, qos: .utility

Open patzootz opened this issue 1 year ago • 4 comments

Hi, I'm building an app that is very db heavy. I've noticed my inserts using dataStack.perform(asynchronous(()) are slow. I was able to have double the insert performance by changing DataStack childTransactionQueue QOS to .userInitiated from .utility

(internal let childTransactionQueue = DispatchQueue.serial("com.coreStore.dataStack.childTransactionQueue", qos: .userInitiated))

Is there a reason for that queue to have lower priority? Is there a faster way to populate the database?

patzootz avatar Oct 22 '23 09:10 patzootz

Asynchronous transactions are executed in a serial queue, so what you're seeing is expected behavior. This ensures that operations within each transaction block do not cause the transactions to conflict with each other.

If you are very sure that your updates will not affect other transactions, feel free to use the DataStack.beginUnsafe() in your own dispatch queue. Just make sure to call transaction.commit() manually as well to save the transaction.

JohnEstropia avatar Oct 22 '23 09:10 JohnEstropia

Thank you for the fast reply. Can be any negative effect from increasing the childTransactionQueue priority? If it manages all async transaction why would we want it to have .utility priority instead of .userInitiated?

I've tried the DataStack.beginUnsafe() approach but for some reason the insert performance was very fast at first but got slower as more as i've added objects to the database.

Any idea why?

patzootz avatar Oct 22 '23 09:10 patzootz

.userInitiated will compete with other tasks that are, well, initiated by the user. CoreStore's asynchronous transactions were designed to work with any common tasks, including background tasks not necessarily invoked by the user (ex: regular background server fetches)

Is it possible that your app has too many queues have high priority? That will tend to starve lower priority queues.

Note that .utility is really not that a low priority. Apple recommends it for importing data.

JohnEstropia avatar Oct 22 '23 10:10 JohnEstropia

Looks like i figured it out. I was doing beginUnsafe each time I've received data from the server (page of 100). If i share the same unsafeTransaction the performance consists

patzootz avatar Oct 22 '23 13:10 patzootz