Book a call
Home  /  Insights  /  SuiteQL

SuiteQL or saved search: how to decide, with the governance maths

Both read the same data. They cost very different amounts, and the break-even is not where most people assume.

A
Atsovia NetSuite team
2 September 2026 · 11 min read

Saved searches and SuiteQL read the same data out of the same account. Choosing between them is not a question of which is better, it is a question of what the code around them is trying to do, and how much it is willing to pay in usage units.

The governance difference is the part most often missed, and it is the one that decides whether a script survives its first busy period.

The cost shape is different, not just the cost

A saved search bills per page of results. A query bills for the run. That single difference is what makes the choice size-dependent rather than a matter of preference: on a small result set they are comparable, and the gap widens with every page.

So the question to ask is not "which is cheaper" but "how many pages am I going to walk". If the answer is one, the decision does not matter much. If the answer is fifty, it is the largest line in your governance budget and nothing else you optimise will matter as much.

Per page versus per run. That is the whole decision, and it only shows up at volume.

Where SuiteQL genuinely wins

01
Joins across several record types
A saved search reaches related records through joined columns, and the syntax gets awkward fast. SQL joins are just joins, and you can join three or four tables without the query becoming unreadable.
02
Aggregation done in the database
SUM, COUNT, GROUP BY and HAVING run server-side and return the aggregate. Aggregating in script means fetching every row and adding them up in JavaScript, paying for the rows to find out you did not need them.
03
Large result sets in a script
This is the governance argument above. Anything iterating thousands of rows belongs in a query.
04
Things saved search cannot express
Self-joins, window functions, subqueries in a WHERE clause, UNION. If you have ever built three saved searches and combined them in script, that was a query.

Where saved searches still win, and it is not close

01
Anything a user touches
Users can open a saved search, change a filter, add a column, export it, and schedule it to themselves. A query is invisible to them. Handing a finance team a query instead of a saved search converts a self-service task into a permanent support ticket.
02
Dashboard portlets and reminders
These consume saved searches natively. There is no equivalent path for a query.
03
Maintenance by someone who is not a developer
A saved search can be adjusted by an administrator six months after you leave. A query lives inside a script file and needs a deployment. That is a real operational cost and it is regularly worth paying the governance premium to avoid it.
04
Ad-hoc investigation
Building a saved search in the UI with results visible as you go is faster than iterating a query through a script log.

The pattern that uses both

The strongest architecture in a Map/Reduce is usually not one or the other. It is a query in getInputData that returns exactly the fields the rest of the script needs, so that map receives everything in the key value and never has to load a record or run a search of its own.

const getInputData = () => ({
type: 'suiteql',
query: `
SELECT t.id, t.tranid, t.trandate, e.companyname, SUM(tl.netamount) AS total
FROM transaction t
JOIN transactionline tl ON tl.transaction = t.id
JOIN entity e ON e.id = t.entity
WHERE t.type = 'SalesOrd' AND t.trandate >= ?
GROUP BY t.id, t.tranid, t.trandate, e.companyname
`,
params: [startDate],
});
Everything map needs arrives in the key value. No load, no lookup, no search inside the loop.

That is where the governance saving actually comes from. Not the query being cheaper than the search in isolation, but the query removing the need for anything else inside the loop. The per-record cost falls to almost nothing and the script stops being the thing that fails at quarter end.

Two things that catch people out

Permissions still apply, a query runs in the context of the executing user or role, so a query that works for you as administrator can return fewer rows for someone else, and that shows up as a bug report about missing data. And the underlying tables are not the record types you know from the UI; column and table names come from the analytics schema, so budget time for looking them up the first few times.

A rule of thumb

If a human being will ever look at it, build a saved search. If only code will ever read it and there is any volume involved, write a query. If it is both, a report users run and a script consumes, build the saved search for them and the query for the script, and accept the small duplication. Trying to make one artefact serve both audiences is how you end up with a saved search that nobody can modify and a script that times out.

Try it on your own numbers

SuiteScript governance calculator

Compare what a paged search and a query actually cost in your script, before you commit to either.

Open the calculator
A
Atsovia NetSuite team
Implementation and development

Years of building on NetSuite: SuiteScript, SuiteFlow, SuiteQL, SuiteTalk, Advanced PDF templates and Celigo integrations. We write these up when a problem comes round for the third time.

More about the team → Get in touch →

Keep reading

SuiteScript
Why your Map/Reduce keeps hitting SSS_USAGE_LIMIT_EXCEEDED
9 min read
Administration
Cutting NetSuite file cabinet costs without deleting anything
7 min read
Manufacturing
Work-order scrap: capturing it where it actually happens
8 min read
Next step

Book a free consultation

Tell us what you are running today and where it is breaking down. Most calls run 20 to 30 minutes and end with a clear next step. We reply within one business day.

Talk to a consultant