SQL Server Query Store on Mac and Linux

Jam SQL Studio reads a database's Query Store history over your existing SQL Server connection, compares the last period against the one before it with execution-weighted averages, and opens the compiled plans each period used — from the macOS, Windows or Linux build of the same desktop app. It is read-only: it never enables Query Store, changes capture mode, forces plans or clears history.

What you need before it shows anything

  • A SQL Server 2016 or later connection (Azure SQL Database and Managed Instance use the same catalog views).
  • Query Store enabled on that database by whoever administers the server. It is a per-database setting and off by default on most databases.
  • VIEW DATABASE STATE on the database — or, from SQL Server 2022, the narrower VIEW DATABASE PERFORMANCE STATE.
  • At least one completed collection interval inside the period you ask about.

Miss any of those and the workspace names the one that is missing instead of showing an empty grid.

What a regression looks like on the screen

Screenshot: query-store-overview.png

The sample below comes from the synthetic fixture that ships with the app and drives its automated tests and screenshots. These are sample numbers from a fixture, not a measurement of anyone's database and not a claim about performance you will gain. It reproduces the shape the real-database test seeds against a live SQL Server: a 20,000-row Orders table, one parameterised query run first without a supporting index and then with one, at a one-minute Query Store interval.

One query, ranked first by duration, with 120 executions in each of the two 24-hour periods:

Execution-weighted averageBaseline periodRecent periodChange
Duration10 ms55 ms+45 ms (+450%)
CPU time8 ms50 ms+42 ms (+525%)
Logical reads120 pages (0.9 MB)900 pages (7.0 MB)+780 pages (+6.1 MB)
Compiled plan used1001 (index seek)1002 (clustered index scan)Compare plans 1001 → 1002

Both periods ran the query the same number of times, so the averages are directly comparable, and the plan column is what makes the row worth opening: the same SQL, a different compiled plan. Every average on that row is weighted by execution count rather than averaged across intervals — with unequal counts an average of per-interval averages can be off by two orders of magnitude, and the documentation works that arithmetic through.

Download Jam SQL Studio Query Store setup and workflow

Three jobs it is built for

1. Find candidate regressions

Pick a period (1 hour, 6 hours, 24 hours or 7 days) and a metric (duration, CPU time or logical reads). The workspace compares that period against the one immediately before it and ranks the queries by how far the metric moved. Queries with fewer than five executions in either period are labelled low sample instead of being presented as findings, and a query that did not run in the baseline is labelled new / no baseline rather than shown as an infinite increase.

2. Inspect the history behind the number

Selecting a query opens its full text, its query_id / query_text_id / context_settings_id and module, both periods' weighted duration, CPU and reads, the aborted and exception executions kept out of those averages, and the per-interval rows the averages were computed from. Boundaries are snapped to whole collection intervals and the effective UTC range is printed, so you can see exactly which intervals were included rather than trusting a rounded window.

3. Compare the compiled plans

Each period's plan ids are listed with their compile time, engine version and compatibility level. One click opens both estimated compiled plans in the plan compare view Jam already uses for execution plans. When the same plan ran in both periods the workspace says so and offers a single plan instead, because that change was not caused by a plan change and the investigation belongs elsewhere.

How this differs from Top SQL and the plan cache

Jam's Performance Dashboard has a Top SQL view, and it answers a different question. Top SQL reads sys.dm_exec_query_stats: a live view of what is in the plan cache right now, accumulated since the last restart or eviction, with no notion of yesterday. Query Store is persisted per-interval history written by the database itself; it survives restarts, keeps the plans that were compiled, and is the only one of the two that can answer "was this slower last week than it is today".

Neither one proves a cause. A metric that moved between two periods is an observed change; a different plan in the recent period is a candidate explanation, not a verdict. Data volume, parameter values, concurrency, statistics and hardware move the same numbers, and the workspace states that next to the comparison instead of implying a diagnosis.

Supported services and permissions

ServiceStatusPermission
SQL Server 2016–2025 (Windows, Linux, VM, container)Supported; verified against SQL Server 2025 with a seeded databaseVIEW DATABASE STATE, or VIEW DATABASE PERFORMANCE STATE from 2022
Azure SQL DatabaseExpected to work; mapped from Microsoft's documentation, not exercised against a live serviceGranted by the database owner
Azure SQL Managed InstanceExpected to work; same caveatVIEW DATABASE STATE
SQL Server 2014 and olderNot supported — Query Store shipped in 2016
Other EngineEdition values (Azure Synapse, Azure SQL Edge, …)Probed — reported as not supported when the catalog views are missingVIEW DATABASE STATE
PostgreSQL, MySQL, Oracle, SQLite, KustoNot applicable — Query Store is a SQL Server feature

Read-only investigation. Every statement the workspace sends is a SELECT over the sys.query_store_* and sys.database_query_store_options catalog views, SERVERPROPERTY() and the metadata functions OBJECT_SCHEMA_NAME / OBJECT_NAME, run on the selected database's own pool. It never enables or alters Query Store, never forces or unforces a plan, never removes a plan, never clears history and never calls sp_query_store_flush_db. Statements are bounded to 60 seconds and Cancel sends a real attention signal to the statement running on the server (a cancel between statements stops the comparison before the next one is sent). Query text, rows and plan XML stay in memory; the tab remembers your filters, not your data.

Licensing

The Query Store workspace carries no cap of its own on either tier. Jam SQL Studio's Personal tier is free for personal, non-commercial use; Pro adds the commercial-use license for $9.99/month or $99/year and lifts the size caps on bulk operations such as export, import, backup and compare. The Query Store workspace is fully available on both tiers.

Frequently asked questions

Is there a SQL Server Query Store GUI for Mac and Linux?

Jam SQL Studio is one. Its Query Store workspace ships in the macOS, Windows and Linux builds of the same desktop app and reads the catalog views over an ordinary SQL Server connection, so no Windows machine, VM or remote desktop is involved. SQL Server Management Studio remains Windows-only, but Query Store itself lives in the database, not in the client.

Does Jam SQL Studio turn Query Store on for me?

No. Query Store is a per-database setting a DBA controls, and it is off by default on most databases. If it is off, the workspace says so and shows the ALTER DATABASE statement that would enable it, as text to hand to whoever owns the server. Opening the tab on a database with Query Store off reads the state and nothing else.

What permissions does a reader need?

VIEW DATABASE STATE on the database is enough on every supported version, and SQL Server 2022 and later also accept the narrower VIEW DATABASE PERFORMANCE STATE. If the grant is missing, the workspace shows the server's own error and names the permission for your version instead of failing silently.

Are the plans actual execution plans?

No, and no tool can make them so. Query Store stores the estimated compiled plan for each plan id; the runtime numbers beside it are aggregates over many executions in an interval, not per-operator measurements from one run. The compare view is labelled estimated and highlights structural differences between the two plans rather than claiming a cause.

What if the database has no Query Store history?

You get a clear state rather than an empty grid. A newly enabled Query Store reports that no interval has closed yet; a period that no completed interval falls inside says so and suggests a longer period, a different anchor or including the in-progress interval; a database whose history is shorter than the period is listed without a comparison and marked not comparable, and a history that reaches only part of the way into the baseline period is not compared either: the table says what share of the baseline it covers instead of comparing against a shorter period.

Can it force a plan or fix the regression?

No. Plan forcing is not part of this read-only release. The workspace runs SELECTs over the Query Store catalog views, SERVERPROPERTY() and the OBJECT_SCHEMA_NAME / OBJECT_NAME metadata functions, and nothing else: no sp_query_store_force_plan, no unforce, no remove, no flush, no configuration change. It shows you which query moved, by how much and on which plans, and leaves the change to you.

Open your own Query Store history

Install Jam SQL Studio on macOS, Windows or Linux, connect to SQL Server, and right-click a database → Query Store…

Download Jam SQL Studio Read the Query Store docs