Bird
Raised Fist0
DynamoDBquery~5 mins

Query result ordering (ascending, descending) in DynamoDB - Time & Space Complexity

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Time Complexity: Query result ordering (ascending, descending)
O(n)
Understanding Time Complexity

When we ask DynamoDB to return items in order, we want to know how the time it takes changes as we get more data.

We are trying to see how sorting results affects the work DynamoDB does.

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


// Query items from a DynamoDB table
const params = {
  TableName: "Orders",
  KeyConditionExpression: "CustomerId = :cid",
  ExpressionAttributeValues: {
    ":cid": { S: "12345" }
  },
  ScanIndexForward: false // false means descending order
};
const result = await dynamodb.query(params).promise();
    

This code fetches all orders for a customer and returns them in descending order by sort key.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: DynamoDB reads each matching item once to return it.
  • How many times: Once per matching item in the query result.
How Execution Grows With Input

As the number of matching items grows, DynamoDB reads more items to return them in order.

Input Size (n)Approx. Operations
10About 10 reads
100About 100 reads
1000About 1000 reads

Pattern observation: The work grows directly with the number of items returned, whether ascending or descending.

Final Time Complexity

Time Complexity: O(n)

This means the time to get results grows linearly with how many items match the query, regardless of order direction.

Common Mistake

[X] Wrong: "Ordering results descending makes the query slower than ascending."

[OK] Correct: DynamoDB stores data sorted by the sort key, so reading in ascending or descending order just changes the direction of reading, not the amount of work.

Interview Connect

Understanding how DynamoDB handles ordering helps you explain how queries scale and shows you know how databases manage data efficiently.

Self-Check

"What if we added a filter expression after the query? How would that affect the time complexity?"

Practice

(1/5)
1. In DynamoDB, which parameter controls whether query results are returned in ascending or descending order based on the sort key?
easy
A. ProjectionExpression
B. ReturnConsumedCapacity
C. ScanIndexForward
D. ConsistentRead

Solution

  1. Step 1: Understand query ordering in DynamoDB

    DynamoDB orders query results based on the sort key, and the order can be controlled.
  2. Step 2: Identify the controlling parameter

    The parameter ScanIndexForward controls ascending (true) or descending (false) order.
  3. Final Answer:

    ScanIndexForward -> Option C
  4. Quick Check:

    Ordering parameter = ScanIndexForward [OK]
Hint: Remember: ScanIndexForward controls ascending/descending order [OK]
Common Mistakes:
  • Confusing ScanIndexForward with ReturnConsumedCapacity
  • Thinking ordering applies to partition key
  • Assuming default order is descending
2. Which of the following is the correct syntax to query a DynamoDB table named Orders with results in descending order on the sort key OrderDate?
easy
A. client.query({ TableName: 'Orders', KeyConditionExpression: 'CustomerId = :id', ExpressionAttributeValues: { ':id': '123' }, ScanIndexForward: true })
B. client.query({ TableName: 'Orders', KeyConditionExpression: 'CustomerId = :id', ExpressionAttributeValues: { ':id': '123' }, ScanIndexForward: false })
C. client.query({ TableName: 'Orders', KeyConditionExpression: 'CustomerId = :id', ExpressionAttributeValues: { ':id': '123' }, Descending: true })
D. client.query({ TableName: 'Orders', KeyConditionExpression: 'CustomerId = :id', ExpressionAttributeValues: { ':id': '123' }, OrderBy: 'DESC' })

Solution

  1. Step 1: Identify the parameter for descending order

    To get descending order, ScanIndexForward must be set to false.
  2. Step 2: Check the syntax correctness

    client.query({ TableName: 'Orders', KeyConditionExpression: 'CustomerId = :id', ExpressionAttributeValues: { ':id': '123' }, ScanIndexForward: false }) uses ScanIndexForward: false correctly; other options use invalid or wrong parameters.
  3. Final Answer:

    Option B syntax with ScanIndexForward false -> Option B
  4. Quick Check:

    Descending order = ScanIndexForward false [OK]
Hint: Use ScanIndexForward false for descending order [OK]
Common Mistakes:
  • Using ScanIndexForward true for descending order
  • Using non-existent parameters like Descending or OrderBy
  • Confusing partition key with sort key ordering
3. Given a DynamoDB table with partition key UserId and sort key Timestamp, what will be the order of results returned by this query?
client.query({
  TableName: 'UserActivity',
  KeyConditionExpression: 'UserId = :uid',
  ExpressionAttributeValues: { ':uid': 'user123' },
  ScanIndexForward: false
})
medium
A. Results unordered
B. Results ordered by Timestamp ascending (oldest first)
C. Results ordered by UserId ascending
D. Results ordered by Timestamp descending (newest first)

Solution

  1. Step 1: Understand ScanIndexForward effect

    Setting ScanIndexForward: false returns results in descending order of the sort key.
  2. Step 2: Identify the sort key

    The sort key is Timestamp, so results are ordered newest to oldest.
  3. Final Answer:

    Results ordered by Timestamp descending (newest first) -> Option D
  4. Quick Check:

    ScanIndexForward false = descending order [OK]
Hint: ScanIndexForward false means newest items first [OK]
Common Mistakes:
  • Assuming ScanIndexForward false orders by partition key
  • Thinking default order is descending
  • Confusing ascending and descending meanings
4. You wrote this DynamoDB query but the results are always in ascending order, even though you want descending order:
client.query({
  TableName: 'Sales',
  KeyConditionExpression: 'StoreId = :sid',
  ExpressionAttributeValues: { ':sid': 'store1' },
  ScanIndexForward: 'false'
})

What is the error?
medium
A. ScanIndexForward must be a boolean, not a string
B. KeyConditionExpression is incorrect
C. ExpressionAttributeValues is missing a value
D. TableName is invalid

Solution

  1. Step 1: Check ScanIndexForward data type

    ScanIndexForward expects a boolean true or false, not a string.
  2. Step 2: Identify impact of wrong type

    Passing 'false' as a string is truthy, so DynamoDB treats it as true (ascending order).
  3. Final Answer:

    ScanIndexForward must be boolean false, not string 'false' -> Option A
  4. Quick Check:

    Boolean type needed for ScanIndexForward [OK]
Hint: Use boolean false, not string 'false' for ScanIndexForward [OK]
Common Mistakes:
  • Passing 'false' as a string instead of boolean
  • Misunderstanding KeyConditionExpression syntax
  • Ignoring data types in parameters
5. You want to retrieve the 5 most recent orders for customer cust123 from a DynamoDB table Orders with partition key CustomerId and sort key OrderDate. Which query will correctly return these orders in descending order by OrderDate?
hard
A. client.query({ TableName: 'Orders', KeyConditionExpression: 'CustomerId = :cid', ExpressionAttributeValues: { ':cid': 'cust123' }, ScanIndexForward: false, Limit: 5 })
B. client.query({ TableName: 'Orders', KeyConditionExpression: 'CustomerId = :cid', ExpressionAttributeValues: { ':cid': 'cust123' }, ScanIndexForward: false })
C. client.query({ TableName: 'Orders', KeyConditionExpression: 'CustomerId = :cid', ExpressionAttributeValues: { ':cid': 'cust123' }, Limit: 5 })
D. client.query({ TableName: 'Orders', KeyConditionExpression: 'CustomerId = :cid', ExpressionAttributeValues: { ':cid': 'cust123' }, ScanIndexForward: true, Limit: 5 })

Solution

  1. Step 1: Set descending order for most recent first

    Use ScanIndexForward: false to get descending order by OrderDate.
  2. Step 2: Limit results to 5

    Use Limit: 5 to get only the top 5 recent orders.
  3. Final Answer:

    Query with ScanIndexForward false and Limit 5 -> Option A
  4. Quick Check:

    Descending + Limit 5 = ScanIndexForward false + Limit 5 [OK]
Hint: Use ScanIndexForward false with Limit 5 for recent 5 items [OK]
Common Mistakes:
  • Using ScanIndexForward true returns oldest first
  • Omitting Limit returns all items
  • Not combining descending order with limit