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

Subquery performance is quite poor #6327

Closed
petmongrels opened this issue Feb 3, 2023 · 13 comments · Fixed by #6328
Closed

Subquery performance is quite poor #6327

petmongrels opened this issue Feb 3, 2023 · 13 comments · Fixed by #6328
Assignees

Comments

@petmongrels
Copy link

petmongrels commented Feb 3, 2023

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

@kneth
Copy link
Contributor

kneth commented Feb 3, 2023

@petmongrels Thank you for reporting. We need to investigate it order to understand what can cause the slower query performance.

@kneth
Copy link
Contributor

kneth commented Feb 3, 2023

@petmongrels If possible, we would appreciate a little example which can reproduce it.

@petmongrels
Copy link
Author

By example, I am guessing you mean a realm database file with data in it. Give us some time to send you that.

@kneth
Copy link
Contributor

kneth commented Feb 6, 2023

If you can give us that - and a few problematic queries - we will appreciate it.

@1t5j0y
Copy link

1t5j0y commented Feb 9, 2023

@kneth we have created a (zipped) realm file to reproduce this.

Problematic queries:
On Individual schema
subjectType.uuid = '9f2af1f9-e150-4f8e-aad3-40bb7eb05aa3' AND SUBQUERY(observations, $observation, (concept.uuid = 'e19e68fd-97f1-4803-a1b2-bb850836ff54' and valueJSON contains '11111111') ).@count > 0
and
voided = false AND subjectType.uuid = '9f2af1f9-e150-4f8e-aad3-40bb7eb05aa3' AND SUBQUERY(enrolments, $enrolment, ( $enrolment.program.uuid = 'e93303fa-f465-4db7-a945-d4fd6295f2b9' ) AND ( $enrolment.encounters.encounterType.uuid = 'e99184ad-9082-43d0-9726-7644e37543dd' ) AND $enrolment.voided = false and $enrolment.programExitDateTime = null ).@count > 0
Please let us know if you need anything further.

@kneth
Copy link
Contributor

kneth commented Feb 9, 2023

@1t5j0y @petmongrels

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.

@petmongrels
Copy link
Author

The uuids are string data types used as primary key.
You can find all our models in this repository: https://github.com/avniproject/avni-models

@kneth
Copy link
Contributor

kneth commented Feb 10, 2023

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 results. Unfortunately v2.28.1 doesn't support M1.

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.

Screenshot 2023-02-10 at 14 52 40

@kneth
Copy link
Contributor

kneth commented Feb 12, 2023

@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?

@1t5j0y
Copy link

1t5j0y commented Feb 13, 2023

@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 v11.4 (~12 mins)

Fri Feb 10 2023 22:04:47 GMT+0530 (India Standard Time)
results.length = 0
Fri Feb 10 2023 22:16:26 GMT+0530 (India Standard Time)

On v2.8.1 (under a second)

Mon Feb 13 2023 11:44:14 GMT+0530 (India Standard Time)
results.length = 0
Mon Feb 13 2023 11:44:14 GMT+0530 (India Standard Time)

@kneth
Copy link
Contributor

kneth commented Feb 13, 2023

@1t5j0y @petmongrels

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.

@jedelbo
Copy link
Contributor

jedelbo commented Feb 22, 2023

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.

@jedelbo jedelbo transferred this issue from realm/realm-js Feb 22, 2023
@kneth
Copy link
Contributor

kneth commented Feb 23, 2023

@1t5j0y @petmongrels

A fix has been merged, and we hope to release it soon. Please keep an eye of Realm JavaScript releases in the near future.

cbush pushed a commit to mongodb/docs-realm that referenced this issue Apr 27, 2023
<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 &gt;= 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 &gt;= 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&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr)

🛠 [Adjust upgrade PR
settings](https://app.snyk.io/org/sandbox-2ba/project/852e6e4f-be96-45c8-b370-1060f5ebee55/settings/integration?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;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&#x3D;realm&amp;utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;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]>
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Mar 21, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants