CoreStore
CoreStore copied to clipboard
Slow DB Performance - DataStack childTransactionQueue, qos: .utility
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?
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.
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?
.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.
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