Bird
Raised Fist0
DynamoDBquery~20 mins

Creating GSI in DynamoDB - Practice Exercises

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
GSI Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
🧠 Conceptual
intermediate
1:30remaining
What is a Global Secondary Index (GSI) in DynamoDB?

Which statement best describes a Global Secondary Index (GSI) in DynamoDB?

AA GSI is a local index that uses the same partition key as the base table but a different sort key.
BA GSI is an index with a partition key and optional sort key that can be different from the base table's keys, allowing queries on non-key attributes.
CA GSI is a backup of the entire table stored in a different region for disaster recovery.
DA GSI automatically duplicates all data from the base table without any key differences.
Attempts:
2 left
💡 Hint

Think about how GSIs let you query data differently than the main table keys.

❓ query_result
intermediate
2:00remaining
Querying a DynamoDB table using a GSI

Given a DynamoDB table Orders with a GSI named CustomerIndex that has CustomerId as the partition key, what will be the output of the following query?

aws dynamodb query \
  --table-name Orders \
  --index-name CustomerIndex \
  --key-condition-expression "CustomerId = :cid" \
  --expression-attribute-values '{":cid":{"S":"C123"}}'

Assume the table has these items:

  • {OrderId: "O1", CustomerId: "C123", Amount: 100}
  • {OrderId: "O2", CustomerId: "C456", Amount: 200}
  • {OrderId: "O3", CustomerId: "C123", Amount: 150}
A[{"OrderId": "O1", "CustomerId": "C123", "Amount": 100}, {"OrderId": "O3", "CustomerId": "C123", "Amount": 150}]
B[{"OrderId": "O2", "CustomerId": "C456", "Amount": 200}]
C[]
DSyntax error due to missing sort key in query
Attempts:
2 left
💡 Hint

The query uses the GSI to find all orders for CustomerId 'C123'.

📝 Syntax
advanced
1:30remaining
Identify the syntax error in GSI creation

Which option contains a syntax error when creating a GSI in a DynamoDB table using AWS CLI?

aws dynamodb update-table \
  --table-name Products \
  --attribute-definitions AttributeName=Category,AttributeType=S, AttributeName=Price,AttributeType=N \
  --global-secondary-index-updates '[{"Create":{"IndexName":"CategoryPriceIndex","KeySchema":[{"AttributeName":"Category","KeyType":"HASH"},{"AttributeName":"Price","KeyType":"RANGE"}],"Projection":{"ProjectionType":"ALL"},"ProvisionedThroughput":{"ReadCapacityUnits":5,"WriteCapacityUnits":5}}}]'
AProvisionedThroughput keys should be strings, not numbers
BIncorrect KeyType value 'RANGE' should be 'SORT'
CMissing comma between attribute definitions
DProjectionType 'ALL' is invalid
Attempts:
2 left
💡 Hint

Check the attribute definitions syntax carefully.

❓ optimization
advanced
1:30remaining
Optimizing GSI throughput settings

You have a GSI on a DynamoDB table with heavy read traffic but low write traffic. Which option optimizes cost while maintaining performance?

ASet ReadCapacityUnits high and WriteCapacityUnits low in ProvisionedThroughput for the GSI
BSet both ReadCapacityUnits and WriteCapacityUnits to high values
CSet ReadCapacityUnits low and WriteCapacityUnits high
DUse On-Demand mode for the GSI to avoid capacity settings
Attempts:
2 left
💡 Hint

Think about which capacity units affect read and write costs.

🔧 Debug
expert
2:00remaining
Why does querying a GSI return no results?

You created a GSI on a DynamoDB table with OrderDate as the partition key. After inserting items, querying the GSI returns no results. What is the most likely cause?

ADynamoDB GSIs do not support queries, only scans
BThe GSI was created with the wrong provisioned throughput settings
CThe query syntax is incorrect and missing the sort key condition
DThe items do not have the <code>OrderDate</code> attribute, so they are not indexed in the GSI
Attempts:
2 left
💡 Hint

Remember how DynamoDB indexes items in GSIs.

Practice

(1/5)
1. What is the main purpose of creating a Global Secondary Index (GSI) in DynamoDB?
easy
A. To automatically backup the table data
B. To increase the storage capacity of the table
C. To allow querying the table using alternative key attributes
D. To encrypt the table data at rest

Solution

  1. Step 1: Understand what a GSI does

    A GSI lets you query a DynamoDB table using different key attributes than the primary key.
  2. Step 2: Compare options to GSI purpose

    Options A, B, and D describe backup, storage, and encryption, which are unrelated to GSI functionality.
  3. Final Answer:

    To allow querying the table using alternative key attributes -> Option C
  4. Quick Check:

    GSI = alternative query keys [OK]
Hint: GSIs let you query by new keys without changing the table [OK]
Common Mistakes:
  • Thinking GSI increases storage size
  • Confusing GSI with backup or encryption features
  • Assuming GSI changes the primary key
2. Which of the following is the correct syntax snippet to define a GSI named OrderDateIndex with OrderDate as the partition key in a DynamoDB table creation JSON?
easy
A. "GlobalSecondaryIndexes": [{"IndexName": "OrderDateIndex", "KeySchema": [{"AttributeName": "OrderDate", "KeyType": "HASH"}], "Projection": {"ProjectionType": "ALL"}}]
B. "GlobalSecondaryIndexes": [{"IndexName": "OrderDateIndex", "KeySchema": [{"AttributeName": "OrderDate", "KeyType": "RANGE"}], "Projection": {"ProjectionType": "ALL"}}]
C. "GlobalSecondaryIndexes": [{"IndexName": "OrderDateIndex", "KeySchema": [{"AttributeName": "OrderDate", "KeyType": "PRIMARY"}], "Projection": {"ProjectionType": "ALL"}}]
D. "GlobalSecondaryIndexes": [{"IndexName": "OrderDateIndex", "KeySchema": [{"AttributeName": "OrderDate", "KeyType": "PARTITION"}], "Projection": {"ProjectionType": "ALL"}}]

Solution

  1. Step 1: Identify correct KeyType for partition key in GSI

    The partition key in DynamoDB GSI uses KeyType "HASH".
  2. Step 2: Check options for correct KeyType and syntax

    "GlobalSecondaryIndexes": [{"IndexName": "OrderDateIndex", "KeySchema": [{"AttributeName": "OrderDate", "KeyType": "HASH"}], "Projection": {"ProjectionType": "ALL"}}] uses "HASH" correctly; B uses "RANGE" (wrong for partition key), C uses invalid "PRIMARY", D uses invalid "PARTITION".
  3. Final Answer:

    "GlobalSecondaryIndexes": [{"IndexName": "OrderDateIndex", "KeySchema": [{"AttributeName": "OrderDate", "KeyType": "HASH"}], "Projection": {"ProjectionType": "ALL"}}] -> Option A
  4. Quick Check:

    Partition key = HASH [OK]
Hint: Partition key in GSI always uses KeyType 'HASH' [OK]
Common Mistakes:
  • Using 'RANGE' instead of 'HASH' for partition key
  • Using invalid KeyType values like 'PRIMARY' or 'PARTITION'
  • Forgetting to define ProjectionType
3. Given a DynamoDB table with a GSI named UserEmailIndex where Email is the partition key, what will be the result of this query?
QueryInput = {
  TableName: "Users",
  IndexName: "UserEmailIndex",
  KeyConditionExpression: "Email = :email",
  ExpressionAttributeValues: {":email": "alice@example.com"}
}
medium
A. Returns all items where Email attribute equals 'alice@example.com' using the GSI
B. Returns all items where Email attribute equals 'alice@example.com' using the main table primary key
C. Returns an error because IndexName cannot be used in QueryInput
D. Returns all items regardless of Email attribute

Solution

  1. Step 1: Understand QueryInput with IndexName

    Specifying IndexName in QueryInput tells DynamoDB to query the GSI instead of the main table.
  2. Step 2: Analyze KeyConditionExpression

    The query filters items where Email equals 'alice@example.com' on the GSI partition key.
  3. Final Answer:

    Returns all items where Email attribute equals 'alice@example.com' using the GSI -> Option A
  4. Quick Check:

    Query with IndexName uses GSI keys [OK]
Hint: Use IndexName in query to search by GSI keys [OK]
Common Mistakes:
  • Assuming query uses main table keys when IndexName is set
  • Thinking IndexName causes error in QueryInput
  • Ignoring KeyConditionExpression filtering
4. You tried to create a GSI with this snippet but got an error:
"GlobalSecondaryIndexes": [{
  "IndexName": "StatusIndex",
  "KeySchema": [{"AttributeName": "Status", "KeyType": "HASH"}],
  "Projection": {"ProjectionType": "INCLUDE", "NonKeyAttributes": []}
}]

What is the likely cause of the error?
medium
A. IndexName cannot contain the word 'Index'
B. NonKeyAttributes must be a non-empty array when ProjectionType is INCLUDE
C. KeyType must be RANGE for GSIs
D. ProjectionType cannot be INCLUDE for GSIs

Solution

  1. Step 1: Check ProjectionType and NonKeyAttributes

    When ProjectionType is INCLUDE, NonKeyAttributes must be a non-empty array listing attributes to project.
  2. Step 2: Verify given snippet

    NonKeyAttributes is [], which is empty and invalid when ProjectionType is INCLUDE.
  3. Step 3: Eliminate other options

    ProjectionType INCLUDE is valid; KeyType HASH is valid for partition key; IndexName can contain 'Index'.
  4. Final Answer:

    NonKeyAttributes must be a non-empty array when ProjectionType is INCLUDE -> Option B
  5. Quick Check:

    INCLUDE projection requires NonKeyAttributes [OK]
Hint: INCLUDE projection needs NonKeyAttributes array [OK]
Common Mistakes:
  • Using empty or missing NonKeyAttributes with INCLUDE
  • Confusing KeyType HASH and RANGE for partition key
  • Thinking IndexName naming causes errors
5. You have a DynamoDB table with primary key UserID. You want to query users by their City and SignupDate. Which GSI definition allows efficient queries for all users in a city sorted by signup date?
hard
A. "GlobalSecondaryIndexes": [{"IndexName": "CitySignupIndex", "KeySchema": [{"AttributeName": "SignupDate", "KeyType": "RANGE"}], "Projection": {"ProjectionType": "ALL"}}]
B. "GlobalSecondaryIndexes": [{"IndexName": "CitySignupIndex", "KeySchema": [{"AttributeName": "SignupDate", "KeyType": "HASH"}, {"AttributeName": "City", "KeyType": "RANGE"}], "Projection": {"ProjectionType": "ALL"}}]
C. "GlobalSecondaryIndexes": [{"IndexName": "CitySignupIndex", "KeySchema": [{"AttributeName": "City", "KeyType": "RANGE"}, {"AttributeName": "SignupDate", "KeyType": "HASH"}], "Projection": {"ProjectionType": "ALL"}}]
D. "GlobalSecondaryIndexes": [{"IndexName": "CitySignupIndex", "KeySchema": [{"AttributeName": "City", "KeyType": "HASH"}, {"AttributeName": "SignupDate", "KeyType": "RANGE"}], "Projection": {"ProjectionType": "ALL"}}]

Solution

  1. Step 1: Identify partition and sort keys for query pattern

    To query all users in a city sorted by signup date, City should be the partition key (HASH) and SignupDate the sort key (RANGE).
  2. Step 2: Check options for correct KeySchema order

    "GlobalSecondaryIndexes": [{"IndexName": "CitySignupIndex", "KeySchema": [{"AttributeName": "City", "KeyType": "HASH"}, {"AttributeName": "SignupDate", "KeyType": "RANGE"}], "Projection": {"ProjectionType": "ALL"}}] correctly sets City as HASH and SignupDate as RANGE. Options B and C swap keys incorrectly. "GlobalSecondaryIndexes": [{"IndexName": "CitySignupIndex", "KeySchema": [{"AttributeName": "SignupDate", "KeyType": "RANGE"}], "Projection": {"ProjectionType": "ALL"}}] lacks partition key.
  3. Final Answer:

    "GlobalSecondaryIndexes": [{"IndexName": "CitySignupIndex", "KeySchema": [{"AttributeName": "City", "KeyType": "HASH"}, {"AttributeName": "SignupDate", "KeyType": "RANGE"}], "Projection": {"ProjectionType": "ALL"}}] -> Option D
  4. Quick Check:

    Partition key = City, Sort key = SignupDate [OK]
Hint: Partition key first (HASH), sort key second (RANGE) in KeySchema [OK]
Common Mistakes:
  • Swapping HASH and RANGE keys
  • Missing partition key in GSI
  • Using only one key when two are needed for sorting
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard