0 0
Read Time:4 Minute, 48 Second

Evaluating Query Acceleration Service Before You Enable: Query Acceleration Service (QAS) is one of Snowflake’s powerful features designed to accelerate large, scan-intensive queries by offloading portions of query processing to shared compute resources. However, the common question every Snowflake administrator faces is: “Should I enable QAS on my warehouse, and if so, what scale factor should I use?”

The Challenge

The Challenge

Before enabling QAS, organizations typically struggle with several questions:

  • How many of our long-running queries are actually eligible for QAS?
  • What performance improvement can we realistically expect?
  • What is the optimal scale factor that balances performance and cost?

The Solution: QAS Evaluation Process

This Process leverages Snowflake’s built-in SYSTEM$ESTIMATE_QUERY_ACCELERATION function to systematically evaluate your historical queries and provide actionable insights.

The framework consists of three components:

  1. Results Table: Stores QAS estimates with query metadata for analysis
  2. Evaluation Procedure: Iterates through long-running queries and captures QAS estimates
  3. Analysis Queries: Provides recommendations based on collected data.

Implementation

Implementation

Step 1: Create the Results Table

First, create a table to store the QAS evaluation results:

CREATE TABLE IF NOT EXISTS ADMIN_DB.PUBLIC.QAS_ESTIMATE_RESULTS (
RUN_TS TIMESTAMP_NTZ,
WAREHOUSE_NAME STRING,
QUERY_ID STRING,
START_TIME TIMESTAMP_TZ,
USER_NAME STRING,
ROLE_NAME STRING,
QUERY_TYPE STRING,
EXECUTION_STATUS STRING,
ELAPSED_MIN NUMBER(18,2),
ESTIMATE_JSON VARIANT,
ERROR_MSG STRING
);

Step 2: Create the Evaluation Procedure

The stored procedure queries ACCOUNT_USAGE.QUERY_HISTORY to find long-running queries, then calls SYSTEM$ESTIMATE_QUERY_ACCELERATION for each query:

QAS Proc

Now execute the procedure:

This procedure will:

  • Looking query back to last 30 days
  • Capture Query which are running more than 10 minutes into QAS_ESTIMATE_RESULTS table.

CALL ADMIN_DB.PUBLIC.RUN_QAS_ESTIMATES_FOR_LONG_RUNNERS_JS('COMPUTE_WH', 30, 10);

Once the procedure executed, QAS_ESTIMATE_RESULTS table got populated.

QAS Proc Output

Understanding the QAS Estimate Output

The SYSTEM$ESTIMATE_QUERY_ACCELERATION function returns a JSON object with valuable information:

{
"status": "eligible",
"originalQueryTime": 320.103,
"upperLimitScaleFactor": 22,
"estimatedQueryTimes": {
"1": 175,
"2": 123,
"4": 89,
"8": 65,
"22": 48
},
"ineligibleReason": null
}

QAS Table

Now once we capture all the desired queries, next to identify which queries are QAS eligible i.e. “status”: “eligible”.

We have parsed the JSON value and extracted

  • MAX_SCALE_FACTOR
  • Time taken to complete query with scale factor 4
  • Time taken to complete query with scale factor 8

SELECT
distinct QUERY_ID,
WAREHOUSE_NAME,
USER_NAME,
ELAPSED_MIN,
ESTIMATE_JSON:status::STRING AS QAS_STATUS,
ESTIMATE_JSON:originalQueryTime::NUMBER(10,2) AS ORIGINAL_TIME_MS,
ESTIMATE_JSON:upperLimitScaleFactor::NUMBER AS MAX_SCALE_FACTOR,

— Time savings at different scale factors
ESTIMATE_JSON:estimatedQueryTimes:"1"::NUMBER AS TIME_AT_SF_1,
ESTIMATE_JSON:estimatedQueryTimes:"2"::NUMBER AS TIME_AT_SF_2,
ESTIMATE_JSON:estimatedQueryTimes:"4"::NUMBER AS TIME_AT_SF_4,
ESTIMATE_JSON:estimatedQueryTimes:"8"::NUMBER AS TIME_AT_SF_8,

— Calculate percentage improvement at max scale factor
ROUND(
(1 - (ESTIMATE_JSON:estimatedQueryTimes:"8"::NUMBER /
ESTIMATE_JSON:originalQueryTime::NUMBER)) * 100,
2
) AS PCT_IMPROVEMENT_SF_8,

ESTIMATE_JSON:ineligibleReason::STRING AS INELIGIBLE_REASON

FROM ADMIN_DB.PUBLIC.QAS_ESTIMATE_RESULTS
WHERE ESTIMATE_JSON:status::STRING = 'eligible'
ORDER BY ELAPSED_MIN DESC;

JSON Extract

Understanding the Improvement Formula

Understanding the Improvement Formula

To calculate the percentage improvement at any scale factor, we use:

Improvement % = (1 – (Estimated Time / Original Time)) × 100

Step-by-Step Calculation Example

Given: Original Time = 320ms, Estimated Time at SF=4 = 89ms

 1: Calculate ratio: 89 / 320 = 0.278 (query takes 27.8% of original time)

2: Subtract from 1: 1 – 0.278 = 0.722 (72.2% time saved)

3: Convert to percentage: 0.722 × 100 = 72.2% improvement in case of Scale factor 4.

With Same calculation we   can see approx 80% improvement in case of Scale factor 8.

Scale Factor Recommendation Query

Use this query to get actionable recommendations for your warehouse:

WITH analysis AS (
SELECT DISTINCT
WAREHOUSE_NAME,
QUERY_ID,
ESTIMATE_JSON:originalQueryTime::NUMBER AS ORIG,
ESTIMATE_JSON:estimatedQueryTimes:"4"::NUMBER AS SF4,
ESTIMATE_JSON:estimatedQueryTimes:"8"::NUMBER AS SF8,
ROUND((1 - ESTIMATE_JSON:estimatedQueryTimes:"4"::NUMBER /
ESTIMATE_JSON:originalQueryTime::NUMBER) * 100, 0) AS PCT_AT_4,
ROUND((1 - ESTIMATE_JSON:estimatedQueryTimes:"8"::NUMBER /
ESTIMATE_JSON:originalQueryTime::NUMBER) * 100, 0) AS PCT_AT_8
FROM ADMIN_DB.PUBLIC.QAS_ESTIMATE_RESULTS
WHERE ESTIMATE_JSON:status::STRING = 'eligible'
)
SELECT
WAREHOUSE_NAME,
COUNT(*) AS ELIGIBLE_QUERIES,
ROUND(AVG(PCT_AT_4), 0) || '%' AS AVG_IMPROVEMENT_SF4,
ROUND(AVG(PCT_AT_8), 0) || '%' AS AVG_IMPROVEMENT_SF8,
ROUND(AVG(PCT_AT_8) - AVG(PCT_AT_4), 0) || '%' AS EXTRA_GAIN_4_TO_8,
CASE
WHEN AVG(PCT_AT_8) - AVG(PCT_AT_4) > 10 THEN 8
WHEN AVG(PCT_AT_4) >= 50 THEN 4
ELSE 4
END AS SUGGESTED_SCALE_FACTOR,
'ALTER WAREHOUSE ' || WAREHOUSE_NAME ||
' SET ENABLE_QUERY_ACCELERATION = TRUE QUERY_ACCELERATION_MAX_SCALE_FACTOR = ' ||
CASE
WHEN AVG(PCT_AT_8) - AVG(PCT_AT_4) > 10 THEN '8'
ELSE '4'
END || ';' AS ENABLE_QAS_SQL
FROM analysis
GROUP BY WAREHOUSE_NAME;

Scale Factor Suggestion

Decision Logic Explained

Condition Recommendation
Extra gain SF8 vs SF4 > 10% Use Scale Factor = 8
SF4 improvement >= 50% Use Scale Factor = 4
Otherwise Default to Scale Factor = 4

Query Acceleration Service is a powerful feature, but enabling it without data-driven analysis is like driving blindfolded. This framework provides the visibility you need to make informed decisions about QAS configuration.

Average Rating

5 Star
0%
4 Star
0%
3 Star
0%
2 Star
0%
1 Star
0%

Leave a Reply

Your email address will not be published. Required fields are marked *