Bird
Raised Fist0
Snowflakecloud~20 mins

Query history and profiling in Snowflake - Practice Problems & Coding Challenges

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
Challenge - 5 Problems
🎖️
Query History and Profiling Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
service_behavior
intermediate
2:00remaining
Understanding Query History Table Output
You run the following query in Snowflake to check recent query history:

SELECT query_id, user_name, execution_status, total_elapsed_time FROM table(information_schema.query_history()) WHERE user_name = 'ANALYST' ORDER BY start_time DESC LIMIT 3;

What will the total_elapsed_time column represent in the output?
Snowflake
SELECT query_id, user_name, execution_status, total_elapsed_time FROM table(information_schema.query_history()) WHERE user_name = 'ANALYST' ORDER BY start_time DESC LIMIT 3;
AThe time in microseconds spent transferring data to the client.
BThe time in seconds the query spent waiting in the queue before execution.
CThe CPU time consumed by the query during execution.
DThe total time in milliseconds that the query took to execute from start to finish.
Attempts:
2 left
💡 Hint
Think about what 'elapsed time' usually means in timing contexts.
🧠 Conceptual
intermediate
2:00remaining
Identifying Query Failures from History
You want to find all queries that failed in the last 24 hours using Snowflake's query history. Which execution_status value should you filter for to get only failed queries?
A'SUCCESS'
B'CANCELED'
C'FAILED'
D'RUNNING'
Attempts:
2 left
💡 Hint
Think about the status that indicates a query did not complete successfully.
Architecture
advanced
2:00remaining
Optimizing Query Profiling for Large Workloads
Your Snowflake account runs thousands of queries daily. You want to efficiently analyze query performance trends over the past week without scanning the entire query history table. Which approach is best to reduce query time and cost?
AUse the QUERY_HISTORY function without any filters and rely on Snowflake to optimize automatically.
BUse the QUERY_HISTORY view with a filter on start_time to limit to the last week and select only needed columns.
CQuery the QUERY_HISTORY table without filters to get all data and then filter in your application.
DDownload the entire query history table and analyze it locally in a spreadsheet.
Attempts:
2 left
💡 Hint
Filtering early reduces data scanned and speeds up queries.
security
advanced
2:00remaining
Controlling Access to Query History Data
Which Snowflake role should you assign to a user to allow them to view query history but prevent them from modifying any data or running queries themselves?
AMONITOR
BSYSADMIN
CACCOUNTADMIN
DPUBLIC
Attempts:
2 left
💡 Hint
This role is designed for read-only monitoring tasks.
Best Practice
expert
3:00remaining
Interpreting Query Profile for Performance Bottlenecks
You examine the query profile for a slow-running Snowflake query. The profile shows a large amount of time spent in the 'Spilled to Disk' operation. What does this indicate and what is the best next step?
AThe query ran out of memory and spilled data to disk, slowing performance; increase warehouse size or optimize query to reduce memory use.
BThe query is waiting on network I/O; check network connectivity and retry.
CThe query is blocked by locks; kill blocking queries to proceed.
DThe query completed successfully with no issues; no action needed.
Attempts:
2 left
💡 Hint
Spilling to disk usually means memory limits were exceeded.

Practice

(1/5)
1. What is the main purpose of the QUERY_HISTORY view in Snowflake?
easy
A. To see details of past queries executed in the system
B. To create new tables and schemas
C. To manage user permissions and roles
D. To monitor network traffic between Snowflake and clients

Solution

  1. Step 1: Understand the role of QUERY_HISTORY

    The QUERY_HISTORY view stores information about queries that have already run, including their text, execution time, and status. Its main purpose is to see details of past queries executed in the system.
  2. Final Answer:

    To see details of past queries executed in the system -> Option A
  3. Quick Check:

    QUERY_HISTORY = past query details [OK]
Hint: QUERY_HISTORY shows past queries and their info [OK]
Common Mistakes:
  • Confusing QUERY_HISTORY with user management
  • Thinking it manages network or security settings
  • Assuming it creates or modifies database objects
2. Which SQL clause correctly filters queries executed by a specific user in the QUERY_HISTORY view?
easy
A. FILTER BY USER = 'john_doe'
B. WHERE USER_NAME = 'john_doe'
C. SELECT USER_NAME FROM QUERY_HISTORY WHERE 'john_doe'
D. HAVING USER_NAME = 'john_doe'

Solution

  1. Step 1: Recall SQL filtering syntax

    To filter rows in SQL, the WHERE clause is used with a condition like USER_NAME = 'value'. WHERE USER_NAME = 'john_doe' is valid and standard SQL syntax.
  2. Final Answer:

    WHERE USER_NAME = 'john_doe' -> Option B
  3. Quick Check:

    Filter with WHERE clause = WHERE USER_NAME = 'john_doe' [OK]
Hint: Use WHERE to filter rows by user name [OK]
Common Mistakes:
  • Using FILTER BY instead of WHERE
  • Misplacing HAVING without GROUP BY
  • Incorrect SELECT syntax without WHERE
3. Given the query:
SELECT query_text, total_elapsed_time FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY()) WHERE execution_status = 'FAILED' ORDER BY start_time DESC LIMIT 1;

What does this query return?
medium
A. The most recent failed query's text and its total elapsed time
B. All successful queries ordered by start time
C. The oldest failed query's text and elapsed time
D. An error because QUERY_HISTORY is not a table

Solution

  1. Step 1: Analyze the query clauses

    The query uses TABLE(INFORMATION_SCHEMA.QUERY_HISTORY()) to access query history, filters for execution_status = 'FAILED', orders by start_time DESC (most recent first), and limits to 1 row, returning the most recent failed query's text and total elapsed time.
  2. Final Answer:

    The most recent failed query's text and its total elapsed time -> Option A
  3. Quick Check:

    Filter failed + order desc + limit 1 = most recent failed query [OK]
Hint: ORDER BY DESC + LIMIT 1 gets latest record [OK]
Common Mistakes:
  • Thinking QUERY_HISTORY is a normal table
  • Confusing oldest vs most recent due to ORDER BY
  • Ignoring the WHERE filter on execution_status
4. You wrote this query to find slow queries but it returns no results:
SELECT query_text FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY()) WHERE total_elapsed_time > 1000;

What is the likely issue?
medium
A. The TABLE() function cannot be used with QUERY_HISTORY
B. QUERY_HISTORY does not have total_elapsed_time column
C. The query_text column cannot be selected from QUERY_HISTORY
D. total_elapsed_time is in microseconds, so 1000 is too small a threshold

Solution

  1. Step 1: Check the unit of total_elapsed_time

    In Snowflake, total_elapsed_time is measured in microseconds, so 1000 microseconds (1 millisecond) is too small a threshold, and few or no queries exceed it, resulting in no results.
  2. Final Answer:

    total_elapsed_time is in microseconds, so 1000 is too small a threshold -> Option D
  3. Quick Check:

    Elapsed time unit = microseconds, threshold too low [OK]
Hint: Check units: elapsed time is microseconds, not milliseconds [OK]
Common Mistakes:
  • Assuming elapsed time is in seconds or milliseconds
  • Thinking QUERY_HISTORY lacks columns
  • Misusing TABLE() function syntax
5. You want to profile query performance by grouping queries by user and calculating average execution time. Which query correctly achieves this?
hard
A. SELECT user_name, SUM(total_elapsed_time) FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY()) WHERE execution_status = 'SUCCESS';
B. SELECT user_name, total_elapsed_time FROM QUERY_HISTORY GROUP BY user_name;
C. SELECT user_name, AVG(total_elapsed_time) AS avg_time FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY()) GROUP BY user_name ORDER BY avg_time DESC;
D. SELECT user_name, AVG(total_elapsed_time) FROM QUERY_HISTORY WHERE total_elapsed_time > 1000 ORDER BY user_name;

Solution

  1. Step 1: Identify correct aggregation and grouping

    To get average execution time per user, use AVG(total_elapsed_time) with GROUP BY user_name from TABLE(INFORMATION_SCHEMA.QUERY_HISTORY()), as in SELECT user_name, AVG(total_elapsed_time) AS avg_time ... GROUP BY user_name ORDER BY avg_time DESC.
  2. Final Answer:

    SELECT user_name, AVG(total_elapsed_time) AS avg_time FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY()) GROUP BY user_name ORDER BY avg_time DESC; -> Option C
  3. Quick Check:

    Group by user + AVG + ORDER BY avg_time = SELECT user_name, AVG(total_elapsed_time) AS avg_time FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY()) GROUP BY user_name ORDER BY avg_time DESC; [OK]
Hint: Use GROUP BY user_name with AVG for profiling [OK]
Common Mistakes:
  • Missing GROUP BY when using aggregation
  • Selecting columns without aggregation
  • Not using TABLE() function for QUERY_HISTORY