2646 No more spool space in %DBID in Teradata
Problem:
Query failed with Error code: 2646 No more spool space in %DBID
Cause:
The following reason the 2646 error can occur:
1. The user spool reaches the maximum limit allocated for the user. The following reason the spool might reach the maximum limit
1.1. The user may have insufficient spool space to run a query
1.2. Spool space allocated to user so if multiple people sign in on using same user ID and running sql that takes spool then the last request may run out of spool space because of excessive request of another session using the same User ID.
1.3. Phantom Spool space (When the DBC.DatabaseSpace table is not properly updated to reflect current and actual space usage that cause the phantom spool)
2. Spool has been exhausted on a single AMP caused by an extremely skewed query. Following reason, the query can be extremely skewed:
2.1. If a query become skewed recently and taking lots of spool space but was not skewed earlier then it can be for not to have updated statistics. Check the statistics are up to date
2.2. The query can be skewed usually for following reason:
2.2.1. Skewed table e.g Bad choice of PI data is skewed
2.2.2. Bad execution plan
2.2.3. Bad data model (normalization, data types, PI etc)
2.2.4. Too many joins
2.2.5. Hash Collision
Solution:
The following way you can start investigation of the root cause of problem:
Reset the pick spool of user:
lock table dbc.dbase for access
update dbc.databasespace
set peakspoolspace = 0
where tableid = '000000000000'xb
and databaseid = (
sel databaseid
from dbc.dbase
where databasenamei = '<User Name>');
Check if the user reaches the maximum spool limit from the Peak Spool and maximum spool information.
SELECT DataBaseName (title 'UserName', format 'x(20)')
,CAST(SUM(MaxSpool)/1024.00/1024.00/1024.00 as DECIMAL(6,2)) as MAX_SPOOL_GB
,CAST(SUM(PeakSpool)/1024.00/1024.00/1024.00 as DECIMAL(6,2)) as Peak_Spool_GB
,CAST(AVG(PeakSpool)/1024.00/1024.00/1024.00 as DECIMAL(6,2)) as AMP_AAVG_GB
,CAST(MIN(PeakSpool)/1024.00/1024.00/1024.00 as DECIMAL(6,2)) as AMP_MIN_GB
,CAST(MAX(PeakSpool)/1024.00/1024.00/1024.00 as DECIMAL(6,2)) as AMP_MAX_GB
,(100 - (AVG(PeakSpool)/nullifzero(MAX(PeakSpool)*100)))(format 'zzz,zzz,999', title 'SkewFactor')
FROM Dbc.DiskSpace
GROUP BY 1 ORDER BY 1
WHERE DataBaseName = '<User name>';
Example Output:
UserName MAX_SPOOL_GB Peak_Spool_GB AMP_AAVG_GB AMP_MIN_GB AMP_MAX_GB SkewFactor
-----------------------------------------------------------------------------------------------------------------------------------------------------------
USER_00001 5120.00 906.42 3.78 3.53 21.33 99.99822974789029
If the peak spool reaches the maximum limit, then increase the spool limit of the user and if the peak spool is much lower than the maximum spool then checks the skew factor. If the skew factor is high, then query is failing for skewness.
Check if the query failing for Phantom spool space or not. To get more information please visit the following link:
http://www.nazmulhuda.info/2646-no-more-spool-space-for-phantom-spool-space
Before you decide to increase the spool space if the user peak spool space reaches the maximum limit, check if there are multiple people sing in on using same user and takes spool by requesting excessive request using the following query
SELECT othq.*
FROM
(
SELECT *
FROM PDCRINFO.DBQLogTbl_Hst
WHERE QueryID = <Query ID> --Query ID of Failed Spool query
-- and ErrorCode=2646
and logdate='2019-03-05' -- Date
) as spq
INNER JOIN PDCRINFO.DBQLogTbl_Hst as othq
ON spq.LogDate = othq.LogDate
AND spq.Username = othq.Username
AND spq.SessionID <> othq.SessionID
AND spq.StartTime < spq.LastRespTime
AND othq.StartTime < othq.LastRespTime
AND PERIOD(othq.StartTime,othq.LastRespTime) OVERLAPS PERIOD(spq.StartTime,spq.LastRespTime)
AND othq.AMPCPUTime > 1000
;
If the user peak spool space reaches the maximum limit and it’s not because of excessive request or Phantom Spool space or skewness, then following way you can increase the spool limit for the user:
# Run the following query to check whether the user has spool space limited through a profile:
SELECT vproc,maxspool,maxprofilespool,currentspool,peakspool
FROM dbc.diskspace
WHERE databasename = '<database or user name>'
WITH sum(maxspool), sum(maxprofilespool), sum(currentspool), sum(peakspool)
ORDER BY 1 ;
# To increase user’s spool space
MODIFY USER <user-name> AS SPOOL = xxxxx BYTES ;
# To increase profile’s spool space
MODIFY PROFILE <profile-name> AS SPOOL = xxxxx BYTES;
Note: If you increase user spool space but the user using profile then the spool space will be override by the value that configured in the profile.
If the query is skewed check the following way if its for insufficient stats collection or not. If its skewed for insufficient stats collection then collect the statistics.
diagnostic helpstats on for session;
explain
<your query>;
If the query has good statistics but it is skewed or taking lots of spool space, then identify the root cause by examining the explain plan of the query and tune it.