Every request to POST /v1/query runs in one of two modes, controlled by the mode field in the request body.
Execute Mode
"mode": "execute" is the default. The engine parses, plans, optimizes, and then runs the query — fetching rows from DynamoDB and returning them in the response.
- Consumes DynamoDB RCUs charged to your AWS account.
- Required scope:
query:execute
- Returns a
data payload with rows, column metadata, and timing fields.
Plan Mode
"mode": "plan" parses and optimizes the query without fetching any data.
- Does NOT consume DynamoDB RCUs.
- Required scope:
query:plan
- Returns a human-readable plan tree, an optimizer weight (cost estimate), and the normalized SQL string.
Plan mode is useful for:
- Debugging slow queries — check whether the optimizer selected an index or fell back to a scan.
- Validating SQL in CI/CD — catch syntax errors and unsupported features without consuming capacity.
- Previewing query structure — understand how the engine will execute a query before running it against production tables.
Understanding the Response Fields
weight
The optimizer’s relative cost estimate. Lower is cheaper. A weight of 0 means no cost estimate was computed — for example, when the query has no index candidates and the optimizer produces a simple scan plan.
planTime
Present in both modes. Covers parse + plan + optimize only. It does not include any DynamoDB I/O.
execTime
Present in execute mode only. Total elapsed time from request receipt to response, including all DynamoDB I/O. Always >= planTime.
Example
Plan mode request:
{
"sql": "SELECT id, total FROM myschema.orders WHERE status = 'pending' LIMIT 10",
"mode": "plan"
}
Plan mode response:
{
"success": true,
"data": {
"plan": "Limit(10)\n Scan(myschema.orders)\n Filter(status = 'pending')",
"weight": 0,
"normalizedSql": "SELECT id, total FROM myschema.orders WHERE status = 'pending' LIMIT 10",
"planTime": 3
}
}
The plan tree shows the engine will perform a full Scan with a Filter applied — no index was matched. If you have a GSI on status, check that the schema metadata is registered correctly in the portal so the optimizer can see it.
If you see Scan(...) in the plan for a query that should use an index, run the query in plan mode first and inspect the tree before paying DynamoDB RCU costs for a scan.
Execute mode request (same query):
{
"sql": "SELECT id, total FROM myschema.orders WHERE status = 'pending' LIMIT 10",
"mode": "execute"
}
Execute mode response:
{
"success": true,
"data": {
"columns": ["id", "total"],
"data": [
["ord-001", 59.99],
["ord-002", 120.00]
],
"firstRowIdx": 0,
"planTime": 3,
"execTime": 47
}
}