DEV Community

umzzil nng
umzzil nng

Posted on Originally published at oraerror.com

Oracle ORA-12827 Error: Causes and Solutions Complete Guide

ORA-12827: Insufficient Parallel Query Slaves Available

ORA-12827 is thrown when Oracle cannot allocate enough parallel query slave processes to satisfy a parallel execution request. This typically happens when the number of available slaves falls below the threshold defined by the PARALLEL_MIN_PERCENT parameter, or when the system-wide PARALLEL_MAX_SERVERS limit has been reached. It is most common in busy Data Warehouse environments where multiple large parallel queries compete for the same pool of slave processes.


Top 3 Causes

1. PARALLEL_MIN_PERCENT Set Too High

When PARALLEL_MIN_PERCENT is set to a non-zero value, Oracle enforces a minimum percentage of requested slaves. If that threshold cannot be met, the query is rejected with ORA-12827 instead of degrading gracefully.

-- Check current setting
SHOW PARAMETER PARALLEL_MIN_PERCENT;

-- Reset to default (0) at session level for immediate relief
ALTER SESSION SET PARALLEL_MIN_PERCENT = 0;

-- Reset at system level permanently
ALTER SYSTEM SET PARALLEL_MIN_PERCENT = 0 SCOPE = BOTH;
Enter fullscreen mode Exit fullscreen mode

2. PARALLEL_MAX_SERVERS Limit Exhausted

PARALLEL_MAX_SERVERS caps the total number of parallel server processes across the entire instance. During peak workloads, this ceiling is often hit when many sessions run parallel queries simultaneously.

-- Check the current limit
SHOW PARAMETER PARALLEL_MAX_SERVERS;

-- Check how many slaves are currently in use
SELECT COUNT(*) AS IN_USE
FROM V$PX_PROCESS
WHERE STATUS = 'IN USE';

-- Increase the limit (tune based on CPU count)
ALTER SYSTEM SET PARALLEL_MAX_SERVERS = 128 SCOPE = BOTH;

-- Identify sessions consuming parallel slaves
SELECT QCSID, COUNT(*) AS SLAVE_COUNT
FROM V$PX_SESSION
GROUP BY QCSID
ORDER BY SLAVE_COUNT DESC;
Enter fullscreen mode Exit fullscreen mode

3. Resource Manager Parallel Server Limit

In environments using Oracle Resource Manager, each Consumer Group can have a hard cap on parallel server usage. Once that cap is hit, any new parallel request from that group triggers ORA-12827.

-- Check parallel limits per consumer group
SELECT PLAN, GROUP_OR_SUBPLAN, PARALLEL_SERVER_LIMIT
FROM DBA_RSRC_PLAN_DIRECTIVES
WHERE PARALLEL_SERVER_LIMIT IS NOT NULL;

-- Increase the limit for a specific group
BEGIN
  DBMS_RESOURCE_MANAGER.CLEAR_PENDING_AREA();
  DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
  DBMS_RESOURCE_MANAGER.UPDATE_PLAN_DIRECTIVE(
    PLAN                      => 'MY_PLAN',
    GROUP_OR_SUBPLAN          => 'BATCH_GROUP',
    NEW_PARALLEL_SERVER_LIMIT => 75
  );
  DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
  DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
END;
/
Enter fullscreen mode Exit fullscreen mode

Quick Fix Solutions

If you need an immediate workaround while investigating the root cause:

-- Disable parallel query for the current session
ALTER SESSION DISABLE PARALLEL QUERY;

-- Force a lower degree of parallelism with a hint
SELECT /*+ PARALLEL(t, 2) */ *
FROM large_table t
WHERE created > SYSDATE - 7;

-- Temporarily reduce parallelism on a specific table
ALTER TABLE large_table PARALLEL 2;
Enter fullscreen mode Exit fullscreen mode

Prevention Tips

Keep PARALLEL_MIN_PERCENT at 0.
The default value of 0 allows Oracle to degrade gracefully by using fewer slaves rather than failing outright. Only set this to a non-zero value if your workload strictly requires a minimum degree of parallelism, and even then, test thoroughly.

-- Validate the parameter is at safe default
SELECT NAME, VALUE
FROM V$PARAMETER
WHERE NAME = 'parallel_min_percent';
Enter fullscreen mode Exit fullscreen mode

Monitor slave utilization proactively.
Schedule the query below to run every few minutes and alert when usage exceeds 80% of the PARALLEL_MAX_SERVERS limit. This gives you time to react before users start hitting ORA-12827.

SELECT
    SYSDATE AS checked_at,
    (SELECT VALUE FROM V$PARAMETER
     WHERE NAME = 'parallel_max_servers')   AS max_servers,
    COUNT(*)                                AS in_use,
    ROUND(COUNT(*) /
        (SELECT VALUE FROM V$PARAMETER
         WHERE NAME = 'parallel_max_servers') * 100, 1) AS pct_used
FROM V$PX_PROCESS
WHERE STATUS = 'IN USE';
Enter fullscreen mode Exit fullscreen mode

Related Errors

Error Code Description
ORA-12801 Error signaled in parallel query server — often accompanies ORA-12827
ORA-12805 Parallel query server died unexpectedly
ORA-12826 Similar slave availability error under different threshold conditions
ORA-04031 Shared Pool memory exhaustion — can co-occur during heavy parallel workloads

📖 Want a more detailed guide?
Check out the full in-depth version (Korean) on oraerror.com — includes detailed analysis, additional SQL examples, and prevention tips.

Top comments (0)