From 1d1b985a71b7791abdce58b90a4fc2c0835328b4 Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Mon, 17 Aug 2026 17:50:53 -0700 Subject: [PATCH 1/2] perf(query-core): Deduplicate tracked query properties Each accessed useQueries result fans the same property out to every observer, making ordinary result mapping quadratic. Track which properties have already been synchronized during the current result pass. This keeps the #7000 behavior while dropping the 10,000-result tracking benchmark from about 699 ms to under 1 ms locally. Co-Authored-By: OpenAI Codex --- .changeset/fuzzy-taxis-track.md | 5 +++++ packages/query-core/src/queriesObserver.ts | 11 ++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 .changeset/fuzzy-taxis-track.md diff --git a/.changeset/fuzzy-taxis-track.md b/.changeset/fuzzy-taxis-track.md new file mode 100644 index 00000000000..46b71afbd67 --- /dev/null +++ b/.changeset/fuzzy-taxis-track.md @@ -0,0 +1,5 @@ +--- +'@tanstack/query-core': patch +--- + +Avoid repeatedly synchronizing the same tracked property across all observers in `useQueries`. diff --git a/packages/query-core/src/queriesObserver.ts b/packages/query-core/src/queriesObserver.ts index 4fcf8e5d41e..c537b557ca8 100644 --- a/packages/query-core/src/queriesObserver.ts +++ b/packages/query-core/src/queriesObserver.ts @@ -200,14 +200,19 @@ export class QueriesObserver< result: Array, matches: Array, ) { + const trackedProps = new Set() + return matches.map((match, index) => { const observerResult = result[index]! return !match.defaultedQueryOptions.notifyOnChangeProps ? match.observer.trackResult(observerResult, (accessedProp) => { // track property on all observers to ensure proper (synchronized) tracking (#7000) - matches.forEach((m) => { - m.observer.trackProp(accessedProp) - }) + if (!trackedProps.has(accessedProp)) { + trackedProps.add(accessedProp) + matches.forEach((m) => { + m.observer.trackProp(accessedProp) + }) + } }) : observerResult }) From 2a312b72198b9be258525fafeb05443370efce01 Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Mon, 17 Aug 2026 21:46:04 -0700 Subject: [PATCH 2/2] test(query-core): Cover repeated property tracking Extend the existing tracking assertion to cover the same property being read from a second result. Co-Authored-By: OpenAI Codex --- packages/query-core/src/__tests__/queriesObserver.test.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/query-core/src/__tests__/queriesObserver.test.tsx b/packages/query-core/src/__tests__/queriesObserver.test.tsx index 4e940fca409..bb7a64c03ca 100644 --- a/packages/query-core/src/__tests__/queriesObserver.test.tsx +++ b/packages/query-core/src/__tests__/queriesObserver.test.tsx @@ -770,6 +770,10 @@ describe('queriesObserver', () => { expect(trackPropSpy).toHaveBeenCalledWith('status') expect(trackPropSpy).toHaveBeenCalledTimes(3) + void trackedResults[1]!.status + + expect(trackPropSpy).toHaveBeenCalledTimes(4) + trackPropSpy.mockRestore() })