Rebecca Stark
04/17/2026, 1:35 PMdata.email . error below, how can i get it to stop attempting this (or make it more flexible to entries without this field)
query statistic job failed due to too many failed tasks: 1/13, the last failure is java.lang.RuntimeException: execute statistics query failed, sql: SELECT cast(9 as INT), cast(34251 as BIGINT), 'data.email', cast(COUNT(1) as BIGINT), cast(IFNULL(SUM(CHAR_LENGTH(`data.email`)), 0) as BIGINT), hex(hll_serialize(IFNULL(hll_raw(`data.email`), hll_empty()))), cast(COUNT(*) - COUNT(`data.email`) as BIGINT), IFNULL(MAX(LEFT(`data.email`, 200)), ''), IFNULL(MIN(LEFT(`data.email`, 200)), ''), cast(-1.0 as BIGINT) FROM `data_lake`.`contacts` partition `contacts`, error: Getting analyzing error. Detail message: Statistics query fail | Error Message [[reason=INTERNAL_ERROR] [msg=invalid field name: data.email: BE:47014]] | QueryId [019d9b94-585a-71bf-80d0-9a02af49fd9b] | SQL [SELECT cast(9 as INT), cast(34251 as BIGINT), 'data.email', cast(COUNT(1) as BIGINT), cast(IFNULL(SUM(CHAR_LENGTH(`data.email`)), 0) as BIGINT), hex(hll_serialize(IFNULL(hll_raw(`data.email`), hll_empty()))), cast(COUNT(*) - COUNT(`data.email`) as BIGINT), IFNULL(MAX(LEFT(`data.email`, 200)), ''), IFNULL(MIN(LEFT(`data.email`, 200)), ''), cast(-1.0 as BIGINT) FROM `data_lake`.`contacts` partition `contacts`]. |Rocky
04/17/2026, 1:35 PMdata.email) via the Flat JSON feature and is attempting to collect statistics on it. However, because data.email is a virtual sub-column (and potentially missing in some rows or not perfectly mapped in the data lake), the Backend (BE) fails to resolve the field name during the internal statistics collection query.
To stop the auto-analyzer from attempting to analyze this field, you have a few options ranging from excluding the table to explicitly defining which columns should be analyzed.
Option 1: Manually Define Columns for Analysis
The best way to "override" the auto-analyzer for a specific table is to create a custom analysis task that explicitly lists only the columns you care about. Since version 3.2.12/3.3.4, user-created tasks overwrite the system-generated ones for that table.
Run the following command, replacing col1, col2, data with the actual columns you want to keep statistics for (excluding the problematic subfield):
sql
CREATE ANALYZE SAMPLE TABLE `data_lake`.`contacts` (col1, col2, data);
Note: Include the parent data column if you want general statistics on the JSON blob itself, but do not use the dot notation like data.email.
Option 2: Exclude the Table from Auto-Analyze
If you do not need statistics for this specific table at all, you can exclude it from the global auto-collection process by creating a custom "ALL" task with an exclude pattern:
sql
CREATE ANALYZE SAMPLE ALL PROPERTIES (
"statistic_exclude_pattern" = "data_lake\\.contacts"
);
Option 3: Disable Flat JSON for the Table
If you don't want StarRocks to automatically extract and "flatten" sub-fields from your JSON data (which is what triggers the analyzer to see data.email), you can disable the feature for this table.
For an OLAP table:
sql
ALTER TABLE `data_lake`.`contacts` SET ("flat_json.enable" = "false");
For external tables (data lake), you can try disabling the session/global variable that handles JSON subfield pruning if the issue persists across many queries:
sql
SET GLOBAL cbo_prune_json_subfield = false;
Option 4: Clear Existing Failed Jobs
After applying one of the above, you may want to clear the history of the failed jobs so the system stops retrying the broken one immediately:
1. Find the job ID: SHOW ANALYZE JOB;
2. Drop the stuck job: DROP ANALYZE <job_id>;
Recommendation:
Start with Option 1. It allows you to keep the benefits of the Cost-Based Optimizer (CBO) for your standard columns while preventing the analyzer from chasing the problematic JSON sub-path.
References
• using_starrocks/Cost_based_optimizer.md
• sql-reference/sql-statements/cbo_stats/CREATE_ANALYZE.md
• sql-reference/sql-statements/cbo_stats/ANALYZE_TABLE.mdRebecca Stark
04/17/2026, 1:37 PMdata . but it seems like the default analyze job on all tables is still picking up contacts (this one)
Id: 19260
Catalog: default_catalog
Database: ALL
Table: ALL
Columns: ALL
Type: FULL
Schedule: SCHEDULE
Properties: {default_job_flag=true}
Status: FAILEDRocky
04/17/2026, 1:38 PMdefault_job_flag=true) is a global task that attempts to cover every table in the catalog. Even if you create a table-specific task, the global task may still include it if the "overwrite" logic isn't triggering (which can happen on older versions or if the global task has already scheduled the work).
To stop the default job from touching the contacts table, you need to use a global exclude pattern.
1. Stop the Global Default Task from analyzing this table
Run this command to create a new global task that explicitly excludes your problematic table. This will effectively override the system's default behavior for that table:
sql
CREATE ANALYZE SAMPLE ALL PROPERTIES (
"statistic_exclude_pattern" = "data_lake\\.contacts"
);
Note: The . is escaped with \\ because this property uses a Java regular expression.
2. Force-clear the stuck jobs
The analyzer often "remembers" failed tasks and retries them. To stop the current loop, you should drop the jobs that are showing as FAILED or `RUNNING`:
sql
-- View the job IDs
SHOW ANALYZE JOB;
-- Drop the specific stuck job (e.g., ID 19260)
DROP ANALYZE 19260;
If you want to clear the slate completely:
sql
DROP ALL ANALYZE JOB;
3. If you are on a version < 3.2.12
On older versions, manual tasks do not automatically override system tasks. If the above doesn't work, you may need to disable the system's auto-collection entirely and rely only on your custom tasks:
sql
-- Disable the built-in system-wide auto-collection
ADMIN SET FRONTEND CONFIG ("enable_auto_collect_statistics" = "false");
-- Then manually create a task for everything EXCEPT the contacts table
CREATE ANALYZE SAMPLE ALL PROPERTIES (
"statistic_exclude_pattern" = "data_lake\\.contacts"
);
Why is this happening? (The Root Cause)
The error invalid field name: data.email: BE:47014 occurs because StarRocks' Flat JSON feature has identified email as a frequent key and is trying to treat it like a real column for statistics. However, because this is an external table (data_lake), the sub-field mapping isn't stable enough for the Backend (BE) to query it as a column during the statistics collection phase.
If you don't need StarRocks to optimize queries for data.email, you can disable this sub-field pruning specifically for your session or globally:
sql
-- Prevents the optimizer from trying to treat JSON subfields as columns
SET GLOBAL cbo_prune_json_subfield = false;
Summary of recommended actions:
1. Run DROP ANALYZE 19260;
2. Run CREATE ANALYZE SAMPLE ALL PROPERTIES ("statistic_exclude_pattern" = "data_lake\\.contacts");
3. If the error persists, use the ADMIN SET FRONTEND CONFIG command to disable the global auto-collector.
References
• using_starrocks/Flat_json.mdRebecca Stark
04/17/2026, 1:40 PMId: 450744
Catalog: default_catalog
Database: data_lake
Table: contacts
Columns: {... everything but data ...}
Type: SAMPLE
Schedule: SCHEDULE
Properties: {statistic_sample_collect_rows=10000000, statistic_auto_collect_ratio=0.8}
Status: PENDING
LastWorkTime: None
Reason:Rocky
04/17/2026, 1:41 PMdata.email) as virtual columns and attempt to collect statistics on them.
The reason your custom job (ID 450744) is PENDING while the system job is still failing is that CREATE ANALYZE creates a policy (schedule), not an immediate execution. It won't run until the table's "health" score drops or the next internal check occurs. Meanwhile, the global "default" job is likely still retrying its previous failed state.
To fix this immediately and prevent it from recurring, follow these steps:
1. Drop the stuck/failing jobs
The system is currently "looping" on the old failed tasks. You need to clear the slate:
sql
-- Drop the global default job that is failing
DROP ANALYZE 19260;
-- Drop your custom scheduled job (we will replace it)
DROP ANALYZE 450744;
2. Run a Manual (Immediate) Analysis
Instead of creating a schedule, run a one-time manual analysis that explicitly includes only the columns you want. This will establish a "Healthy" status for the table and stop the analyzer from hunting for more columns for a while.
sql
-- Replace col1, col2 with your actual table columns, excluding 'data'
ANALYZE SAMPLE TABLE `data_lake`.`contacts` (col1, col2)
PROPERTIES ("statistic_sample_collect_rows" = "1000000");
3. Exclude the table from the Global Auto-Analyzer
To ensure the system's "Collect All" job never tries to "helpfully" re-analyze data.email on this table again, create a global exclude rule. This is the most reliable way to prevent the default_job_flag=true job from touching this table.
sql
CREATE ANALYZE SAMPLE ALL PROPERTIES (
"statistic_exclude_pattern" = "data_lake\\.contacts"
);
4. Optional: Disable Flat JSON for this table
If you do not need StarRocks to optimize queries specifically for sub-fields within that JSON (i.e., you're fine with standard JSON processing performance), you can disable the feature for this specific table. This removes the data.email virtual column from the metadata entirely, so the analyzer won't even see it.
sql
ALTER TABLE `data_lake`.`contacts` SET ("flat_json.enable" = "false");
Why "PENDING"?
A job created via CREATE ANALYZE stays in PENDING if:
• Table Health is high: The system thinks the current stats (even if failed/empty) are "good enough" based on the statistic_auto_collect_ratio (default 0.8).
• Resource Constraints: There is a limit on concurrent analyze tasks.
• Trigger Interval: The background thread only checks for work every few minutes.
Recommendation: Use Step 3 to permanently blacklist this specific table from the global auto-collection, and use Step 2 whenever you need to refresh its stats manually.
References
• using_starrocks/Flat_json.md
• administration/management/BE_configuration.mdRebecca Stark
04/17/2026, 1:43 PMRocky
04/17/2026, 1:43 PMjson_flat_sparsity_factor (Default 0.3): At least 30% of rows must contain the field name.
* json_flat_null_factor (Default 0.3): No more than 30% of the rows for that field can be NULL. (In recent versions, this logic is often tuned to allow more sparse data).
If your columns appear in 75% of rows, they likely meet these thresholds and are being physically stored as sub-columns. The remaining 25% of rows are simply stored as NULL in that sub-column.
2. The Benefits of Flattening Sparse Columns
Even if a field is only in 50% of your rows, flattening it provides:
* Massive IO Savings: When you run SELECT data.email, StarRocks reads only the small email sub-column from disk instead of reading and parsing the entire massive data JSON blob for every row.
* Predicate Pushdown: Filters like WHERE data.email = 'abc' can be pushed directly to the storage engine (BE), allowing it to skip data blocks that don't match, which is impossible with raw JSON.
* Vectorized Execution: Once flattened, the data is treated like a standard VARCHAR or INT column, allowing the SIMD-optimized execution engine to process it much faster than the row-by-row logic required for JSON parsing.
3. Why the "Looping" is happening anyway
The reason you are seeing that "invalid field name" error isn't because the data is sparse, but because of a metadata mismatch often found in Data Lake (External) tables:
1. The FE (Frontend) sees data.email and thinks "Hey, this is a common path, I should collect stats on it!"
2. However, because it's an external table (Parquet/ORC in a lake), the BE (Backend) doesn't have a stable "physical" sub-column for that JSON path yet.
3. The internal SQL triggered by the analyzer fails because it's trying to query a column that hasn't been "physically" realized in the same way an internal StarRocks table would.
What should you do?
If you want the performance benefits for your 50%-75% columns without the analyzer crashing:
1. Lower the thresholds to ensure your 50% columns get flattened:
sql
ALTER TABLE `data_lake`.`contacts` SET (
"flat_json.null.factor" = "0.6", -- Allow up to 60% NULLs
"flat_json.sparsity.factor" = "0.4"
);
2. Keep the manual exclusion from the previous step. In StarRocks 4.0, the "Auto-Analyzer" is sometimes more aggressive than the "Flat JSON" extraction logic on external tables. By excluding the table from the Auto-Analyzer but keeping flat_json.enable = true, you get the query speed (flattening) without the analysis crashes.
Summary: Don't disable Flat JSON just because data is sparse. It's actually the best use case for it. Just prevent the analyzer from trying to "measure" those virtual sub-columns on your data lake table.Rebecca Stark
04/17/2026, 1:48 PMRocky
04/17/2026, 1:49 PMdata.email) and treats them as "virtual columns" to speed up queries.
2. Auto-Analyze (Enabled by default): The analyzer sees these "virtual columns" and tries to collect statistics on them.
The Bug: When the analyzer runs on an external table (Hive, Iceberg, etc.), it attempts to query data.email as a discrete column from the remote storage. Since the remote Parquet/ORC file only has a data column and doesn't know what email is, the Backend returns invalid field name.
Does this hurt performance?
No. You do not lose the performance benefits of Flat JSON by skipping analysis.
* Flat JSON still handles the IO pruning and fast extraction during your actual SELECT queries.
* Statistics are primarily used by the Cost-Based Optimizer (CBO) to decide things like Join order. For JSON sub-fields, the CBO is usually fine using default estimates; it’s much more important to have stats on your ID, Date, and Category columns.
How to handle this proactively
1. The "Safety Net" (Global Table Exclusion)
Instead of waiting for each table to fail, you can update the global analyze policy to ignore any table in your data lake that contains JSON.
If your JSON tables follow a naming pattern (e.g., they are all in one database or end in _raw), use the pattern:
sql
-- This overrides the system default for all tables matching the pattern
CREATE ANALYZE SAMPLE ALL PROPERTIES (
"statistic_exclude_pattern" = "data_lake\\..*|another_db\\.json_.*"
);
2. The "Surgical" Approach (Custom Jobs)
If you still want statistics for the non-JSON columns in those tables (which is recommended for join performance), you should create a specific analyze job for those tables that explicitly lists the columns to include:
sql
-- This tells StarRocks: "Only ever look at these columns for this table"
CREATE ANALYZE SAMPLE TABLE `data_lake`.`contacts` (user_id, created_at, city)
PROPERTIES (
"statistic_auto_collect_ratio" = "0.2"
);
3. Proactive Check for other JSON tables
You can find other tables that might cause this issue by running this query against your StarRocks metadata:
sql
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME
FROM information_schema.columns
WHERE DATA_TYPE = 'json'
AND TABLE_SCHEMA NOT IN ('information_schema', '_statistics_');
Summary Recommendation
Until a future patch (likely 4.0.9 or later) refines how the analyzer handles virtual JSON paths in external catalogs:
1. Identify your Data Lake tables with JSON columns.
2. Exclude those tables from the global auto-analyzer using "statistic_exclude_pattern".
3. Manually define analyze jobs for the important non-JSON columns in those tables to keep your JOINs fast.
References
• using_starrocks/Flat_json.mdRocky
04/17/2026, 1:49 PMdata.email as a high-frequency field and "promotes" it to a virtual column to speed up your queries.
2. The Auto-Analyzer's Mistake: The global auto-analyze job sees these virtual columns and tries to run SELECT data.email FROM table to gather statistics.
3. The "Invalid Field" Error: On external tables (Iceberg, Hive, etc.), these virtual sub-fields aren't always "bound" in the metadata layer in a way the Analyzer's background tasks can query safely. This leads to the invalid field name error.
Why your new job is "PENDING"
Your manual job (ID 450744) is PENDING because StarRocks' scheduler is currently blocked by the failed global job (ID 19260). The system often prioritizes finishing (or retrying) the existing "Default" tasks before starting new custom ones for the same table.
──────────
Recommended Proactive Strategy for JSON Tables
Instead of fighting individual table errors as they pop up, use these steps for all your tables with JSON:
1. Blacklist all JSON-heavy External Tables
If you have multiple tables in data_lake that use JSON, use a regex pattern to exclude them from the global system job entirely. This is the most "stable" way to run 4.0.8 right now:
sql
-- This creates a global policy that tells the system:
-- "Do not automatically analyze ANY columns in these specific tables"
CREATE ANALYZE SAMPLE ALL PROPERTIES (
"statistic_exclude_pattern" = "data_lake\\.(contacts|orders|events|users)"
);
2. Clean up the stuck "Pending/Failed" jobs
The "Default" job won't go away on its own if it keeps retrying. You must kill the cycle:
sql
-- Kill all existing analyze tasks to clear the queue
DROP ALL ANALYZE JOB;
3. Manually Analyze only the "Real" columns
If you need stats for the non-JSON columns (like id or created_at) to help the query optimizer, run a manual one-time task for just those columns:
sql
-- This bypasses the 'data' column entirely and finishes immediately
ANALYZE SAMPLE TABLE `data_lake`.`contacts` (id, user_id, status, created_at);
Is there a risk to skipping analysis?
The only "downside" to skipping analysis on the data column is that the optimizer won't know the cardinality (unique values) of data.email. However:
• Query speed remains fast: Flat JSON still works! Your SELECT data.email queries will still be accelerated by the columnar storage.
• Join performance: Unless you are frequently joining two different tables on a JSON sub-field (e.g., t1.data.id = t2.data.id), you don't actually need statistics on those sub-fields for good performance.
Summary: For version 4.0.8, keep Flat JSON enabled for the query speed, but exclude the tables from Auto-Analyze to prevent these metadata crashes.Rebecca Stark
04/17/2026, 1:49 PMRocky
04/17/2026, 1:49 PMPENDING
In StarRocks, there is a crucial distinction between two commands:
* CREATE ANALYZE (Policy): This creates a background schedule. It doesn't run immediately. It waits until the table's "health" score drops below your statistic_auto_collect_ratio (0.8). If you just created the table or the stats are simply missing/failed, the scheduler might not "pick it up" for a few minutes or until more data is loaded.
* ANALYZE TABLE (Execution): This is a manual command that runs the analysis immediately.
To see if your logic actually works, run a manual task instead of a policy:
sql
ANALYZE SAMPLE TABLE `default_catalog`.`data_lake`.`contacts` (col1, col2, col3)
PROPERTIES ("statistic_sample_collect_rows" = "1000000");
(Replace col1, col2... with your actual non-JSON columns. If this succeeds, your logic is sound.)
2. Why the "Invalid Field Name" error occurs on Internal Tables
Even for internal tables, the Flat JSON feature extracts common paths (like data.email) into internal "virtual" columns.
* The Conflict: The 4.0.x Auto-Analyzer sees these virtual columns in the metadata and tries to include them in its sampling queries.
* The Bug: In some 4.0.x sub-versions, the sampling logic used by the analyzer doesn't correctly "bind" these virtual JSON paths during the internal SELECT it runs to gather stats, resulting in the invalid field name error.
3. Should you proactively skip analysis on all JSON tables?
Yes, you should.
For the time being, the most stable approach for any table with JSON columns in 4.0.8 is to explicitly define the column list for statistics, excluding the JSON columns.
Why?
* Stability: You prevent the "Invalid Field Name" loop that crashes the global analyzer.
* Performance is unaffected: You do not need statistics on JSON sub-fields to get the speed benefits of Flat JSON. The query engine will still use the flattened sub-columns for fast IO and filtering even if the optimizer doesn't have the exact cardinality of data.email.
* Resource Savings: Analyzing JSON fields is computationally expensive. Skipping them saves significant FE/BE CPU.
4. Recommended "Clean Slate" Workflow
To resolve the PENDING status and fix the errors across your cluster:
1. Clear the stuck queue:
sql
DROP ALL ANALYZE JOB;
2. Verify what's being flattened:
If you're curious which fields the system is trying (and failing) to analyze, run this on your internal tables:
sql
SELECT flat_json_meta(data) FROM contacts[_META_];
3. Create a targeted policy for your JSON tables:
Instead of letting the system guess, tell it exactly which columns to care about:
sql
CREATE ANALYZE SAMPLE TABLE contacts (id, name, created_at)
PROPERTIES ("statistic_sample_collect_rows" = "1000000");
4. Global Exclusion (Optional but recommended):
If you have many JSON tables and don't want to manage them one-by-one, you can exclude them from the "Default" system job using a regex:
sql
CREATE ANALYZE SAMPLE ALL PROPERTIES (
"statistic_exclude_pattern" = "data_lake\\.._contacts._|data_lake\\.._other_json_table._"
);
Summary: You are seeing a 4.0.x "teething" issue where the analyzer tries to be too smart with JSON. Proactively excluding JSON columns from analysis is the current best practice for cluster stability in this version.
References
• using_starrocks/Cost_based_optimizer.mdRocky
04/17/2026, 1:49 PMRebecca Stark
04/17/2026, 1:52 PMRocky
04/17/2026, 1:52 PMRebecca Stark
04/17/2026, 1:56 PM*************************** 4. row ***************************
Id: 451696
Catalog: default_catalog
Database: ALL
Table: ALL
Columns: ALL
Type: SAMPLE
Schedule: SCHEDULE
Properties: {statistic_exclude_pattern=data_lake\.contacts}
Status: PENDING
LastWorkTime: None
Reason:
*************************** 5. row ***************************
Id: 451868
Catalog: default_catalog
Database: ALL
Table: ALL
Columns: ALL
Type: FULL
Schedule: SCHEDULE
Properties: {default_job_flag=true}
Status: RUNNING
LastWorkTime: None
Reason:
5 rows in set (0.05 sec)Rocky
04/17/2026, 1:56 PMdefault_job_flag=true job is a built-in system task that ignores custom properties (like your exclude pattern). When you DROP ALL ANALYZE JOB, the system's "Auto-Full" scheduler simply recreates it a few minutes later because it sees tables that it thinks need fresh statistics.
To stop the default job from returning and force the system to respect your exclusion rules, you need to follow these three steps:
1. Disable the "Default Full" Statistics Collector
You must tell the Frontend (FE) to stop creating that "Default Full" job automatically. This will not stop analysis entirely; it just stops the uncontrolled full-table collector.
sql
-- Run this as a user with ADMIN privileges
ADMIN SET FRONTEND CONFIG("enable_collect_full_statistic" = "false");
2. Purge the existing queue
Once the config is changed, kill the current running and pending jobs one last time:
sql
DROP ALL ANALYZE JOB;
3. Re-apply your custom policy
Now, create your custom "All" job. Because you disabled the default full job in step 1, this custom job will now be the only thing governing your cluster's automatic statistics collection. It will respect the exclusion pattern.
sql
CREATE ANALYZE SAMPLE ALL PROPERTIES (
"statistic_exclude_pattern" = "data_lake\\.contacts|database_name\\.other_json_table"
);
Why this works:
* enable_collect_full_statistic = false: This disables the "System Default" job (default_job_flag=true) that you see as RUNNING.
* Your Custom Job: Since you used CREATE ANALYZE ... ALL, this becomes the new global scheduler. It will scan your tables every 5 minutes, but when it reaches data_lake.contacts, it will match your regex and skip it entirely.
* SAMPLE vs FULL: By using SAMPLE ALL, you also protect your cluster's resources. FULL analysis on large internal tables can cause heavy IO, whereas SAMPLE (the default for your new job) is much lighter.
How to verify:
After about 5–10 minutes, run SHOW ANALYZE JOB again. You should see:
1. Only one row where Database: ALL and Table: ALL.
2. The Properties column should contain your statistic_exclude_pattern.
3. The default_job_flag=true should be gone.
References
• administration/management/FE_configuration.md
• administration/management/BE_configuration.md
• using_starrocks/async_mv/use_cases/query_rewrite_with_materialized_views.md
• unloading/Spark_connector.md
• faq/resource_isolation_faq.mdRebecca Stark
04/17/2026, 3:37 PMRocky
04/17/2026, 3:37 PMdefault_job_flag=true) to ensure the Optimizer has data.
To stop the "resurrection" and ensure your custom job is the only one running, follow these steps:
1. Verify the Configuration Stuck
First, check if your configuration change actually applied. Sometimes in multi-FE clusters, the setting might not persist if not run correctly.
sql
ADMIN SHOW FRONTEND CONFIG LIKE "enable_collect_full_statistic";
* If it says `true`: The system will keep recreating that default job.
* If it says `false`: And the job still returns, move to Step 2.
2. The "Nuclear" Option (Master Switch)
If enable_collect_full_statistic is not enough to stop the specific behavior in your version (4.0.x), you can use the master toggle. This stops all background statistics collection (default and custom), allowing you to wipe the slate clean.
sql
-- 1. Stop all analyzer activity globally
ADMIN SET FRONTEND CONFIG("enable_statistic_collect" = "false");
-- 2. Clear all jobs
DROP ALL ANALYZE JOB;
-- 3. (Wait 10 seconds) Re-enable the analyzer
ADMIN SET FRONTEND CONFIG("enable_statistic_collect" = "true");
-- 4. Ensure the "Full" default job doesn't come back
ADMIN SET FRONTEND CONFIG("enable_collect_full_statistic" = "false");
3. Re-create your Custom Job
Now that the system is "quiet," create your custom job. Crucially, make sure your regex pattern is correct for a default_catalog internal table. The pattern matches database.table.
sql
CREATE ANALYZE SAMPLE ALL PROPERTIES (
"statistic_exclude_pattern" = "data_lake\\.contacts",
"statistic_auto_collect_ratio" = "0.8"
);
Why you saw both jobs at once
In your previous output, you had:
* Job 451696: Your custom job (with the exclude pattern).
* Job 451868: The system default job.
In StarRocks 3.3+ and 4.0, the system allows custom jobs to coexist with system jobs. However, if they both exist for ALL, the system may trigger both. By setting enable_collect_full_statistic = false, you are specifically telling the FE: "Do not generate the internal 'Full' job; I will manage the 'All' scheduling myself."
One last thing to check
If the jobs still reappear as RUNNING (not just PENDING), check if they are being triggered by your data loads:
sql
ADMIN SHOW FRONTEND CONFIG LIKE "enable_statistic_collect_on_first_load";
If this is true, every INSERT or STREAM LOAD into a new partition will trigger an immediate, one-off analysis task regardless of your background jobs. You can disable this with:
sql
ADMIN SET FRONTEND CONFIG("enable_statistic_collect_on_first_load" = "false");
References
• sql-reference/sql-statements/cbo_stats/SHOW_ANALYZE_JOB.md
• sql-reference/sql-statements/cbo_stats/CREATE_ANALYZE.md
• using_starrocks/Cost_based_optimizer.mdRebecca Stark
04/17/2026, 4:03 PMRocky
04/17/2026, 4:04 PMdefault_job_flag=true) is returning as Type: FULL even after you have set enable_collect_full_statistic = false, it usually means one of three things is happening in your version (4.0.x):
1. You are not connected to the Leader FE
In StarRocks, ADMIN SET FRONTEND CONFIG only applies to the FE node you are currently connected to. Since the Leader FE is the only one that manages the Statistics Scheduler, if you ran the command on a Follower FE, the Leader remains unaware of the change and continues to recreate the default job using its own local true setting.
The Fix:
Check which node is the leader and connect directly to its IP/port:
sql
SHOW FRONTEND; -- Look for the 'IsMaster' or 'Role' column (LEADER)
Once connected to the Leader, run:
sql
ADMIN SET FRONTEND CONFIG("enable_collect_full_statistic" = "false");
DROP ALL ANALYZE JOB;
2. The "Conflicts Overwrite" Logic
In StarRocks 3.3 and 4.0, a custom job is supposed to "overwrite" the default job if the scopes conflict. However, if the system doesn't detect a perfect overlap, it keeps both.
* Your Job: Type: SAMPLE, Database: ALL, Table: ALL.
* System Job: Type: FULL, Database: ALL, Table: ALL.
Because one is SAMPLE and one is FULL, the 4.0 scheduler sometimes treats them as non-conflicting (thinking you want a regular sample but the system still "needs" a full).
The Fix:
Try creating your custom job as a FULL job but with the exclude pattern. This forces the scheduler to recognize that your job is a direct replacement for the system's "Full" job.
sql
-- 1. Ensure you are on the LEADER
-- 2. Create the replacement
CREATE ANALYZE FULL ALL PROPERTIES (
"statistic_exclude_pattern" = "data_lake\\.contacts"
);
3. Check for the "Hard-Kill" Flag
There is a specific property introduced in some 3.x/4.0 builds to stop the "Default" job from being re-initialized entirely. Try setting this if the others fail:
sql
ADMIN SET FRONTEND CONFIG("enable_auto_collect_statistics" = "false");
(Note: This is a newer/specific internal flag that explicitly tells the FE "Do not re-init the default job flag if it's missing".)
Summary Checklist:
1. Verify the config on the Leader node specifically.
2. Set enable_collect_full_statistic = false on the Leader.
3. Set enable_statistic_collect_on_first_load = false on the Leader.
4. Run DROP ALL ANALYZE JOB.
5. Wait 10 minutes. If a job returns, check `SHOW ANALYZE JOB`—it should now at least be Type: SAMPLE. If it's still Type: FULL, the FE configuration is definitely not "sticking" on the leader node.
Last Resort: If you are using a managed environment or K8s, ensure that your fe.conf file doesn't have enable_collect_full_statistic = true explicitly set, as some deployment tools will "re-apply" the config file settings to the memory of the FE periodically.
References
• using_starrocks/Cost_based_optimizer.mdRebecca Stark
04/17/2026, 4:05 PMRocky
04/17/2026, 4:05 PMsql
SHOW FRONTENDS;
Look at the Role column in the output. You should see one node labeled as LEADER.
Why this is critical:
In a multi-FE cluster, "Follower" nodes only have a read-only copy of the metadata. When you run ADMIN SET FRONTEND CONFIG, if you are connected to a Follower:
1. The change is often local to that node's memory.
2. The Leader (which actually manages the Analyze Scheduler) never sees the instruction to stop.
3. The Leader continues its default logic and recreates the job.
The sequence to fix this once and for all:
1. Connect your MySQL client directly to the IP of the LEADER FE (usually port 9030).
2. Run these commands while connected to the Leader:
sql
-- This tells the Leader to stop the default "Full" generator
ADMIN SET FRONTEND CONFIG("enable_collect_full_statistic" = "false");
-- This stops the immediate "on-load" analysis
ADMIN SET FRONTEND CONFIG("enable_statistic_collect_on_first_load" = "false");
-- Wipe the slate clean
DROP ALL ANALYZE JOB;
3. Finally, re-apply your custom job (still on the Leader):
sql
CREATE ANALYZE SAMPLE ALL PROPERTIES (
"statistic_exclude_pattern" = "data_lake\\.contacts"
);
Wait 5 minutes and run SHOW ANALYZE JOB again. If you see only your custom job with the exclude pattern, you have successfully overridden the system defaults.
References
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_FRONTENDS.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_BACKENDS.md
• using_starrocks/Cost_based_optimizer.md
References
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_FRONTENDS.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_BACKENDS.md
• administration/management/FE_configuration.mdRebecca Stark
04/17/2026, 4:42 PMRocky
04/17/2026, 4:43 PMdefault_job_flag=true) to ensure the Optimizer isn't running blind.
If you have already set the common flags to false and the job still returns, it is likely due to one of the following three reasons:
1. You are seeing the "Default Sample" Job
In StarRocks 3.3 and 4.0, the system doesn't just have a default "Full" job; it can also generate a default "Sample" job if it feels the data is too large for full collection.
* The Fix: Check if there is an additional config called enable_collect_sample_statistic. Even if you disabled full, this one might still be true.
sql
-- Run this on the LEADER FE
ADMIN SET FRONTEND CONFIG("enable_collect_full_statistic" = "false");
ADMIN SET FRONTEND CONFIG("enable_collect_sample_statistic" = "false"); -- If available in your build
2. The "Overwriting" Logic (Conflict check)
Starting in version 3.3/4.0, StarRocks allows system and custom jobs to coexist. A custom job only "replaces" the default job if they conflict.
* The Conflict Rule: If your custom job is SAMPLE but the system wants a FULL job, it sees no conflict and recreates the default FULL job anyway.
* The Fix: Create your custom "exclude" job as a FULL job. This forces the scheduler to see your job as a direct replacement for the default system job.
sql
-- Connect to LEADER FE
DROP ALL ANALYZE JOB;
CREATE ANALYZE FULL ALL PROPERTIES (
"statistic_exclude_pattern" = "data_lake\\.contacts"
);
3. The Leader FE vs. Follower FE Mismatch
ADMIN SET FRONTEND CONFIG is a memory-only change. If you run it on a Follower node, the Leader node (which is the only one that actually manages the analyze scheduler) remains completely unaware of your change. It will keep seeing its own local config as true and recreating the job.
* The Fix:
1. Run SHOW FRONTENDS; to identify the node where IsMaster or Role is LEADER.
2. Connect your MySQL client directly to that Leader IP.
3. Run the "Master Disable" sequence:
sql
-- 1. Hard stop the entire scheduler thread
ADMIN SET FRONTEND CONFIG("enable_statistic_collect" = "false");
-- 2. Disable the specific job generators
ADMIN SET FRONTEND CONFIG("enable_collect_full_statistic" = "false");
ADMIN SET FRONTEND CONFIG("enable_statistic_collect_on_first_load" = "false");
-- 3. Clear the metadata
DROP ALL ANALYZE JOB;
-- 4. Re-enable the scheduler and add your replacement
ADMIN SET FRONTEND CONFIG("enable_statistic_collect" = "true");
CREATE ANALYZE FULL ALL PROPERTIES (
"statistic_exclude_pattern" = "data_lake\\.contacts"
);
How to verify it's finally dead:
After 5–10 minutes, run:
sql
SHOW ANALYZE JOB;
If you see only one job and its Id is the one you just created (and default_job_flag is false), then the guardian has accepted your custom job as the global authority.
Note: If you are using StarRocks in Kubernetes or via a management tool, check if your fe.conf has these values hardcoded. Some operators will reset the memory configuration to match the file if the FE restarts or reloads.
References
• administration/management/FE_configuration.mdRebecca Stark
04/17/2026, 4:54 PM*************************** 7. row ***************************
Id: 455305
Catalog: default_catalog
Database: ALL
Table: ALL
Columns: ALL
Type: SAMPLE
Schedule: SCHEDULE
Properties: {default_job_flag=true}
Status: PENDING
LastWorkTime: None
Reason:
7 rows in set (0.04 sec)Rocky
04/17/2026, 4:54 PMenable_collect_full_statistic to `false`—is that StarRocks has two parallel "automatic" triggers. While you disabled the automatic Full collection, the system still has an automatic Sample collection policy that kicks in when tables are large or when statistics health drops below a threshold.
To stop this once and for all, you need to use the absolute global master switch and ensure no "ghost" settings are lingering on the Leader FE.
1. Use the Global Master Switch
In StarRocks, enable_auto_collect_statistics is often used as a shorthand in examples, but the documented global configuration that controls the entire Statistics Scheduler (both default and custom) is:
sql
ADMIN SET FRONTEND CONFIG("enable_statistic_collect" = "false");
Setting this to false on the Leader FE will stop the Statistics Manager thread from generating any jobs, including the default one.
2. Why it is currently showing "SAMPLE"
Even with enable_collect_full_statistic = false, the system is likely hitting the statistic_auto_collect_sample_threshold (default 0.3). If a table's statistics health is lower than this, the system automatically generates a SAMPLE job to ensure the Optimizer has at least some data to work with.
To prevent the system from "falling back" to a default sample job, you should also disable the sample trigger:
sql
ADMIN SET FRONTEND CONFIG("statistic_auto_collect_sample_threshold" = "0.0");
3. The "Overwrite" Requirement (Version 3.3/4.0+)
In recent versions, StarRocks allows custom and system jobs to coexist. A system job (default_job_flag=true) only disappears if a custom job directly conflicts with its scope.
* The Problem: If your custom job is SAMPLE but the system thinks it needs a FULL job (or vice versa), it may treat them as non-conflicting and keep both.
* The Fix: If you want to use a custom job with an exclusion pattern, create it as a FULL job to ensure it "claims" the global scope and displaces the default system job:
sql
-- 1. Hard stop on Leader FE
ADMIN SET FRONTEND CONFIG("enable_statistic_collect" = "false");
DROP ALL ANALYZE JOB;
-- 2. Create your authoritative "Replacement" job
CREATE ANALYZE FULL ALL PROPERTIES (
"statistic_exclude_pattern" = "data_lake\\.contacts"
);
-- 3. Re-enable the scheduler
ADMIN SET FRONTEND CONFIG("enable_statistic_collect" = "true");
Final Checklist
1. Verify the Leader node: Run SHOW FRONTENDS;. Only the node with IsMaster: true or Role: LEADER manages these jobs. If you run the ADMIN commands on a Follower, the Leader will never see the change.
2. Check `fe.conf`: If you are in a Kubernetes environment, ensure these flags are not being overridden by the environment variables or the config file upon FE restart.
3. Check the Threshold: Set statistic_auto_collect_ratio to 0.0 if you want to stop the "health check" from triggering new jobs entirely.
References
• administration/management/FE_configuration.md
• using_starrocks/Cost_based_optimizer.md
• sql-reference/sql-statements/cbo_stats/CREATE_ANALYZE.md
References
• administration/management/FE_configuration.md
• using_starrocks/Cost_based_optimizer.mdRebecca Stark
04/17/2026, 5:14 PMenable_auto_collect_statistics, enable_collect_full_statistic, and enable_statistic_collect_on_first_load to false as i need to tell the default ALL tables analyze job to skip some tables with json fields (its erroring out on the json). despite all of those settings, a default_catalog ALL tables job keeps getting auto-created in my cluster. i set these in fe.conf as well as manually in the sql. of note, running 4.0.8.Rocky
04/17/2026, 5:14 PMSAMPLE) to ensure the Optimizer doesn't run with zero information. This is why it keeps "returning" even after you delete it.
Because you are dealing with JSON errors and want to exclude specific tables, the goal isn't just to "disable" everything, but to replace the system's default job with your own custom authoritative job.
Here is the precise sequence to fix this on your 4.0.8 cluster:
1. Identify the Correct Parameter
While you mentioned enable_auto_collect_statistics, the master switch in the configuration is actually enable_statistic_collect.
• `enable_statistic_collect`: The global switch for the Analyze Scheduler thread.
• `enable_collect_full_statistic`: Specifically controls the Full collection generator.
2. The "Overwriting" Strategy
Starting in version 3.3, StarRocks allows custom jobs to overwrite system jobs if they have the same scope (conflict). If you create a custom job for ALL, the system will stop recreating the default_job_flag=true job because the requirement for a global job is already met by yours.
3. Execution Steps (Must be on Leader FE)
Connect to your Leader FE and run these commands:
sql
-- 1. Disable the system's own 'Full' and 'First Load' generators
ADMIN SET FRONTEND CONFIG("enable_collect_full_statistic" = "false");
ADMIN SET FRONTEND CONFIG("enable_statistic_collect_on_first_load" = "false");
-- 2. Prevent the health-check from triggering a fallback SAMPLE job
-- Set these to 0 so the system never thinks stats are 'unhealthy' enough to auto-trigger
ADMIN SET FRONTEND CONFIG("statistic_auto_collect_ratio" = "0.0");
ADMIN SET FRONTEND CONFIG("statistic_auto_collect_sample_threshold" = "0.0");
-- 3. Clear existing jobs
DROP ALL ANALYZE JOB;
-- 4. Create your authoritative CUSTOM replacement job.
-- This job will 'claim' the ALL scope, but apply your exclusion regex.
-- Note: 'statistic_exclude_pattern' uses regex (e.g., "db\\.table")
CREATE ANALYZE FULL ALL PROPERTIES (
"statistic_exclude_pattern" = "your_db\\.table_with_json|other_db\\.bad_table"
);
4. Why JSON is failing (StarRocks 4.0 Context)
In StarRocks 4.0, Flat JSON is enabled by default. When you run ANALYZE, the system may be attempting to analyze the automatically extracted "flattened" sub-columns. If the JSON structure is highly inconsistent or has very deep nesting, the statistics collector can hit edge-case errors.
Important Note on fe.conf:
If you have these set in fe.conf, ensure they use the correct names:
properties
enable_statistic_collect = true
enable_collect_full_statistic = false
enable_statistic_collect_on_first_load = false
_(We keep enable_statistic_collect = true so that your custom job actually runs for the other tables)._
How to verify:
Run SHOW ANALYZE JOB; after a few minutes.
1. You should see only one job for Database: ALL, Table: ALL.
2. The Properties column for that job should not contain default_job_flag=true.
3. The Properties column should contain your statistic_exclude_pattern.
References
• using_starrocks/Cost_based_optimizer.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cbo_stats/CREATE_ANALYZE.md
• using_starrocks/Flat_json.md
References
• administration/management/FE_configuration.mdRocky
04/17/2026, 5:14 PMRebecca Stark
04/17/2026, 5:45 PMRocky
04/17/2026, 5:45 PMSHOW ANALYZE JOB output and your fe.conf to get a quick diagnosis.
* Join Link: https://try.starrocks.com/join-starrocks-on-slack
* Key Channel: #support or #general
2. GitHub Issues (Bug Reporting)
If you believe this is a bug where the "Guardian" logic is ignoring explicit false configurations in v4.0.8, you should file an issue. This notifies the maintainers and creates a formal record for a fix.
* Link: https://github.com/StarRocks/starrocks/issues
* What to include: Mention your version (4.0.8), the fact that enable_statistic_collect and others are set to false, and provide the output of SHOW ANALYZE JOB.
3. Professional & Enterprise Support
For production-critical issues requiring SLAs, CelerData is the primary organization that provides enterprise-grade support and professional services for StarRocks.
* Contact: CelerData Support
Summary of your specific 4.0.8 issue for the engineers:
When you reach out, emphasize that:
1. Version: 4.0.8.
2. Configurations: enable_statistic_collect, enable_collect_full_statistic, and enable_statistic_collect_on_first_load are all false on the Leader FE.
3. Symptom: A Type: SAMPLE job with default_job_flag=true and Database: ALL is automatically recreated despite being manually dropped and the triggers being disabled.
4. Impact: This job is hitting tables with JSON fields and failing, preventing clean statistics for the rest of the cluster.
References
• project_help/slack.md
• developers/How_to_Contribute.md
• developers/development-environment/dev-env-setup.md
• faq/resource_isolation_faq.mdRebecca Stark
04/17/2026, 7:45 PMRocky
04/17/2026, 7:45 PMSHOW STATS_META command.
1. View Statistics Health
Run the following SQL command to see the health of all tables in your current database:
sql
SHOW STATS_META;
For a specific table, you can use:
sql
SHOW STATS_META WHERE Table = 'your_table_name';
2. Understanding the Output
The key columns to look at for auto-analyze thresholds are:
* Healthy: A percentage value (0–100). If this falls below your configured threshold, a collection job is triggered.
* TableHealthyMetrics: This shows the raw data used for the calculation, usually in the format: [UpdatedRows / TotalRows].
* Type: Tells you if the last collection was FULL or SAMPLE.
3. How Health Relates to Your Thresholds
StarRocks uses two main thresholds to determine when to trigger the automatic jobs you've been seeing:
Metric | Trigger Threshold | Default Value | Description
Full Collection | statistic_auto_collect_ratio | 0.8 | If health drops below 80, the system schedules a Full Analyze.
Sample Collection | statistic_auto_collect_sample_threshold | 0.3 | If health drops below 30, the system schedules a Sample Analyze.
4. How Health is Calculated
The system doesn't just look at row counts; it looks at data churn:
1. Small updates (< 10 partitions updated):
Health = 1 - (Updated Rows since last analyze / Total Rows)
2. Large updates (>= 10 partitions updated):
Health = 1 - MIN(Updated Rows ratio, Updated Partitions ratio)
Why it matters for your JSON issue:
Since you are seeing a SAMPLE job keep reappearing, it is almost certain that one of your tables has a Healthy score below 30 (0.3). Even if you set the auto-collect flags to false, the Statistics Manager may be triggering this as a "failsafe" because the metadata is considered critically stale.
To stop the trigger, as mentioned previously, you should set both thresholds to 0.0 on the Leader FE:
sql
ADMIN SET FRONTEND CONFIG("statistic_auto_collect_ratio" = "0.0");
ADMIN SET FRONTEND CONFIG("statistic_auto_collect_sample_threshold" = "0.0");
References
• sql-reference/sql-statements/cbo_stats/SHOW_META.md
• using_starrocks/Cost_based_optimizer.md
References
• sql-reference/sql-statements/cbo_stats/SHOW_META.md
• using_starrocks/Cost_based_optimizer.md
• sql-reference/information_schema/partitions_meta.md
• sql-reference/sql-statements/table_bucket_part_index/SHOW_PARTITIONS.mdRebecca Stark
04/17/2026, 7:45 PMRocky
04/17/2026, 7:46 PMsql
-- Correct syntax (space instead of underscore)
SHOW STATS META;
If you want to filter for a specific table or database:
sql
SHOW STATS META WHERE Table = 'your_table_name';
-- OR
SHOW STATS META WHERE Database = 'your_db_name';
2. How to Read the Health Metrics
In the output of SHOW STATS META, pay attention to these three columns:
* Healthy: A percentage (0 to 100). 100 means the statistics perfectly match the current data volume.
* TableHealthyMetrics: Shows the data churn ratio that calculated the health.
* UpdateTime: The last time a successful ANALYZE was performed on that table.
3. Why your settings aren't stopping the "Auto-Job"
The reason you are seeing a default job reappear despite your settings likely comes down to the exact parameter names. You mentioned enable_auto_collect_statistics, but the system switch is actually enable_statistic_collect (no "auto", no "s" at the end).
If you want to stop the auto-creation once and for all, run these exact commands on your Leader FE:
sql
-- The master switch for the background Analyze thread
ADMIN SET FRONTEND CONFIG("enable_statistic_collect" = "false");
-- The switch for the default "Full" automatic generator
ADMIN SET FRONTEND CONFIG("enable_collect_full_statistic" = "false");
-- The switch for loading-triggered collection
ADMIN SET FRONTEND CONFIG("enable_statistic_collect_on_first_load" = "false");
-- Kill any existing running tasks and clear the jobs
KILL ANALYZE ALL;
DROP ALL ANALYZE JOB;
4. How to see what the job is doing right now
Since you mentioned the job is "erroring out on the JSON," you can see the specific error message by running:
sql
SHOW ANALYZE STATUS;
Check the Reason column for the tasks that have a Status of FAILED. This will confirm if it is indeed hitting a JSON limit or a specific parsing issue in 4.0.8.
Summary of Parameter Names:
* Incorrect: enable_auto_collect_statistics
* Correct: enable_statistic_collect
References
• sql-reference/sql-statements/cbo_stats/SHOW_META.md
• using_starrocks/Cost_based_optimizer.md
• administration/management/FE_configuration.md
References
• using_starrocks/Cost_based_optimizer.md