Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Slow DB Performance - DataStack childTransactionQueue, qos: .utility #490

Open
patzootz opened this issue Oct 22, 2023 · 4 comments
Open

Comments

@patzootz
Copy link

patzootz commented Oct 22, 2023

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?

@JohnEstropia
Copy link
Owner

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.

@patzootz
Copy link
Author

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?

@JohnEstropia
Copy link
Owner

.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.

@patzootz
Copy link
Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants