-
Notifications
You must be signed in to change notification settings - Fork 167
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
Subquery performance is quite poor #6327
Comments
@petmongrels Thank you for reporting. We need to investigate it order to understand what can cause the slower query performance. |
@petmongrels If possible, we would appreciate a little example which can reproduce it. |
By example, I am guessing you mean a realm database file with data in it. Give us some time to send you that. |
If you can give us that - and a few problematic queries - we will appreciate it. |
@kneth we have created a (zipped) realm file to reproduce this. Problematic queries: |
I have downloaded the file, and we can take a closer look. You mention it was fast in v2.28.1 but UUID was introduced in v10.5.0 so I imagine you had different queries earlier. |
The uuids are string data types used as primary key. |
I have been using the following script: const Realm = require("realm");
let realm = new Realm({ path: "anonymized.realm" });
console.log(new Date().toString());
let results = realm.objects("Individual").filtered("subjectType.uuid = '9f2af1f9-e150-4f8e-aad3-40bb7eb05aa3' AND SUBQUERY(observations, $observation, (concept.uuid = 'e19e68fd-97f1-4803-a1b2-bb850836ff54' and valueJSON contains '11111111') ).@count > 0");
console.log(`results.length = ${results.length}`);
console.log(new Date().toString());
realm.close(); It takes about 8 minutes on my computer (MacBook Pro M1) with v11.4.0, and it reports 0 objects in I have profiled the scripts, and getting backlinks give a heavy load. We probably need to profile some more to get a better understanding of the performance. |
@petmongrels Unfortunately the Realm file you have created cannot be opened using older versions of Realm JS. If possible, can you create a file with v2.28.1 so we can see the difference in performance with different versions? |
@kneth file created using v2.28.1 available here. This has relatively fewer records but still in the same ballpark. Ran the same nodeJS script you created on a 10th Gen Intel i7:
On v2.8.1 (under a second)
|
Thank you for the new file. After a number of runs, I believe the regression was introduced in v3.4.0. It includes #3432 and we need investigate if it is the root cause. |
Yes, the "optimization" that @kneth points to has a really negative influence in this use case. We will have to investigate some more to figure out what the cure would be. |
A fix has been merged, and we hope to release it soon. Please keep an eye of Realm JavaScript releases in the near future. |
<h3>Snyk has created this PR to upgrade realm from 11.5.2 to 11.6.0.</h3> :information_source: Keep your dependencies up-to-date. This makes it easier to fix existing vulnerabilities and to more quickly identify and fix newly disclosed vulnerabilities when they affect your project. <hr/> - The recommended version is **1 version** ahead of your current version. - The recommended version was released **22 days ago**, on 2023-03-23. <details> <summary><b>Release notes</b></summary> <br/> <details> <summary>Package name: <b>realm</b></summary> <ul> <li> <b>11.6.0</b> - <a href="https://snyk.io/redirect/github/realm/realm-js/releases/tag/v11.6.0">2023-03-23</a></br><h3>Enhancements</h3> <ul> <li>Added configuration option <code>App.baseFilePath</code> which controls where synced Realms and metadata is stored.</li> </ul> <h3>Fixed</h3> <ul> <li>Fix type error when using <code>realm.create</code> in combination with class base models. (since v11.0.0)</li> </ul> <h3>Compatibility</h3> <ul> <li>React Native >= v0.71.0</li> <li>Realm Studio v13.0.0.</li> <li>File format: generates Realms with format v23 (reads and upgrades file format v5 or later for non-synced Realm, upgrades file format v10 or later for synced Realms).</li> </ul> <h3>Internal</h3> <ul> <li>Test</li> </ul> </li> <li> <b>11.5.2</b> - <a href="https://snyk.io/redirect/github/realm/realm-js/releases/tag/v11.5.2">2023-03-16</a></br><h3>Fixed</h3> <ul> <li>Suppress omitting <code>objcMsgsend</code> stubs to ensure backward compatibility with Xcode 13. It can be observed as <code>Undefined symbols for architecture arm64: "_objc_msgSend$allBundles", referenced from: realm::copy_bundled_realm_files() in librealm-js-ios.a(platform.o)</code> when using a React Native app for iOS. (<a href="https://snyk.io/redirect/github/realm/realm-js/issues/5511" data-hovercard-type="issue" data-hovercard-url="/realm/realm-js/issues/5511/hovercard">#5511</a>, since v11.5.1)</li> <li>It is not allowed to specify <code>deleteRealmIfMigrationIsNeeded</code> and sync. This can lead to error messages like <code>Schema validation failed due to the following errors</code>. (<a href="https://snyk.io/redirect/github/realm/realm-js/issues/5548" data-hovercard-type="issue" data-hovercard-url="/realm/realm-js/issues/5548/hovercard">#5548</a>, v10.12.0)</li> <li>Installation will no longer hang when using Node 19. (<a href="https://snyk.io/redirect/github/realm/realm-js/issues/5136" data-hovercard-type="issue" data-hovercard-url="/realm/realm-js/issues/5136/hovercard">#5136</a>, since v10.13.0)</li> <li>Fixed enums which was accidentally exported on the <code>Realm</code> namespace without a backing implementation. (<a href="https://snyk.io/redirect/github/realm/realm-js/pull/5493" data-hovercard-type="pull_request" data-hovercard-url="/realm/realm-js/pull/5493/hovercard">#5493</a>, since v11.0.0)</li> <li>Converting local Realm to synced Realm crashes if an embedded object is null. (<a href="https://snyk.io/redirect/github/realm/realm-js/issues/5389" data-hovercard-type="issue" data-hovercard-url="/realm/realm-js/issues/5389/hovercard">#5389</a>, since v10.13.0)</li> <li>Fixed performance degradation on subqueries. (<a href="https://snyk.io/redirect/github/realm/realm-core/issues/6327" data-hovercard-type="issue" data-hovercard-url="/realm/realm-core/issues/6327/hovercard">realm/realm-core#6327</a>, since v6.0.0)</li> <li>Fixed crash if secure transport returns an error with a non-zero length. It can be observed as <code>Reading failed: Premature end of input</code> in the log. (<a href="https://snyk.io/redirect/github/realm/realm-core/issues/5435" data-hovercard-type="issue" data-hovercard-url="/realm/realm-core/issues/5435/hovercard">realm/realm-core#5435</a>, since v10.0.0)</li> <li>Creating subscriptions with queries having Unicode parameters causes a server error e.g., <code>query from client: "{"Product":"(stringQueryField BEGINSWITH B64\"2KzZhdi52Kpz\" )"}" could not be parsed</code>. (<a href="https://snyk.io/redirect/github/realm/realm-core/issues/6350" data-hovercard-type="issue" data-hovercard-url="/realm/realm-core/issues/6350/hovercard">realm/realm-core#6350</a>, since v10.11.0)</li> </ul> <h3>Compatibility</h3> <ul> <li>React Native >= v0.71.0</li> <li>Atlas App Services.</li> <li>Realm Studio v13.0.0.</li> <li>File format: generates Realms with format v23 (reads and upgrades file format v5 or later for non-synced Realm, upgrades file format v10 or later for synced Realms).</li> </ul> <h3>Internal</h3> <ul> <li>Upgraded Realm Core from v13.4.2 to v13.6.0. (<a href="https://snyk.io/redirect/github/realm/realm-js/issues/5495" data-hovercard-type="issue" data-hovercard-url="/realm/realm-js/issues/5495/hovercard">#5495</a>)</li> <li>All exceptions thrown out of Realm Core are now of type <code>Exception</code>.</li> </ul> </li> </ul> from <a href="https://snyk.io/redirect/github/realm/realm-js/releases">realm GitHub release notes</a> </details> </details> <details> <summary><b>Commit messages</b></summary> </br> <details> <summary>Package name: <b>realm</b></summary> <ul> <li><a href="https://snyk.io/redirect/github/realm/realm-js/commit/5196e76d65c5faffa4246daeb3683ac6d0d17b35">5196e76</a> [11.6.0] Bump version</li> <li><a href="https://snyk.io/redirect/github/realm/realm-js/commit/430afad55f3883c210449470788b93cc7dc41cd0">430afad</a> Expose baseFilePath on App configuration (#5572)</li> <li><a href="https://snyk.io/redirect/github/realm/realm-js/commit/22977eaf83d21acec6200f636f75e2c99d365085">22977ea</a> Fix Create Call Signature (#5617)</li> <li><a href="https://snyk.io/redirect/github/realm/realm-js/commit/832fd6a03d30123e047996005c6c1fc812653048">832fd6a</a> Reenable all tests (#5606)</li> <li><a href="https://snyk.io/redirect/github/realm/realm-js/commit/b7245b3c60305baee7a22c35857c71de4fb407ff">b7245b3</a> Disable ccache for node builds (#5602)</li> <li><a href="https://snyk.io/redirect/github/realm/realm-js/commit/bf629d375370285c8870b025c704b8a65b008c4f">bf629d3</a> Prepare for vNext (#5567)</li> <li><a href="https://snyk.io/redirect/github/realm/realm-js/commit/46711a59419a87c8a3bf973d155ff8fe9a12818c">46711a5</a> Prepare for 11.5.2 (#5560)</li> </ul> <a href="https://snyk.io/redirect/github/realm/realm-js/compare/d401cbeb41e76d42a45ba5dd4dc0b26eb71cbb9c...5196e76d65c5faffa4246daeb3683ac6d0d17b35">Compare</a> </details> </details> <hr/> **Note:** *You are seeing this because you or someone else with access to this repository has authorized Snyk to open upgrade PRs.* For more information: <img src="https://api.segment.io/v1/pixel/track?data=eyJ3cml0ZUtleSI6InJyWmxZcEdHY2RyTHZsb0lYd0dUcVg4WkFRTnNCOUEwIiwiYW5vbnltb3VzSWQiOiJiYmYyNzYyNS0wZWU5LTQ2MDEtODU2MS00Y2Y4YmY2ZGY0MmYiLCJldmVudCI6IlBSIHZpZXdlZCIsInByb3BlcnRpZXMiOnsicHJJZCI6ImJiZjI3NjI1LTBlZTktNDYwMS04NTYxLTRjZjhiZjZkZjQyZiJ9fQ==" width="0" height="0"/> 🧐 [View latest project report](https://app.snyk.io/org/sandbox-2ba/project/852e6e4f-be96-45c8-b370-1060f5ebee55?utm_source=github&utm_medium=referral&page=upgrade-pr) 🛠 [Adjust upgrade PR settings](https://app.snyk.io/org/sandbox-2ba/project/852e6e4f-be96-45c8-b370-1060f5ebee55/settings/integration?utm_source=github&utm_medium=referral&page=upgrade-pr) 🔕 [Ignore this dependency or unsubscribe from future upgrade PRs](https://app.snyk.io/org/sandbox-2ba/project/852e6e4f-be96-45c8-b370-1060f5ebee55/settings/integration?pkg=realm&utm_source=github&utm_medium=referral&page=upgrade-pr#auto-dep-upgrades) <!--- (snyk:metadata:{"prId":"bbf27625-0ee9-4601-8561-4cf8bf6df42f","prPublicId":"bbf27625-0ee9-4601-8561-4cf8bf6df42f","dependencies":[{"name":"realm","from":"11.5.2","to":"11.6.0"}],"packageManager":"npm","type":"auto","projectUrl":"https://app.snyk.io/org/sandbox-2ba/project/852e6e4f-be96-45c8-b370-1060f5ebee55?utm_source=github&utm_medium=referral&page=upgrade-pr","projectPublicId":"852e6e4f-be96-45c8-b370-1060f5ebee55","env":"prod","prType":"upgrade","vulns":[],"issuesToFix":[],"upgrade":[],"upgradeInfo":{"versionsDiff":1,"publishedDate":"2023-03-23T17:43:34.744Z"},"templateVariants":[],"hasFixes":false,"isMajorUpgrade":false,"isBreakingChange":false,"priorityScoreList":[]}) ---> --------- Co-authored-by: snyk-bot <[email protected]>
How frequently does the bug occur?
Always
Description
SUBQUERY(observations, $observation, (concept.uuid = 'e19e68fd-97f1-4803-a1b2-bb850836ff54' and valueJSON contains '11111111') ).@count > 0
on Schema Individual.
This takes for ever, we waited for 5 minutes. We have 3.5 million observations, about 100k Individuals which is the parent of this Observation, and 1500 Concepts. valueJSON as less than 1 KB strings.
The data model.
{
name: "Individual",
primaryKey: "uuid",
properties: {
uuid: "string",
observations: {type: "list", objectType: "Observation"}
}
}
{
name: "Observation",
properties: {
concept: "Concept",
valueJSON: "string",
}
}
{
name: "Concept",
primaryKey: "uuid",
properties: {
uuid: "string",
},
}
observations.concept.uuid = 'e19e68fd-97f1-4803-a1b2-bb850836ff54' and observations.valueJSON contains '11111111'
on Schema Individual is quite fast but that not what we want.
We have run this in latest Realm Studio version - 13.0.2 and in android mobile emulators with realm js version as 11.0.0-rc.1
We have been using realm for 6 years on the same product and we are quite sure that in version 2.28.1 this quite fast. Also from release notes we didn't see any subquery related issues fixed since 11.0.0-rc1 and of course we see that it is slow in latest Realm Studio as well.
Stacktrace & log output
No response
Can you reproduce the bug?
Always
Reproduction Steps
No response
Version
v11.0.0-rc.1
What services are you using?
Local Database only
Are you using encryption?
No
Platform OS and version(s)
Android API version 9 and later
Build environment
Which debugger for React Native: ..
Cocoapods version
No response
The text was updated successfully, but these errors were encountered: