쿼리가 다음 오류로 중단된다.
SQL Anywhere Error: 1009170: You have run out of space in IQ_SYSTEM_TEMP DBspace.
SAP IQ(옛 Sybase IQ) 는 정렬 · 해시 조인 · 그룹화 · 중간 결과 구체화에 임시 저장 공간을 쓴다. 이 공간이 IQ_SYSTEM_TEMP DBspace 이고, 여기 파일이 가득 차면 실행 중인 쿼리가 실패한다.
테이블 데이터가 들어가는 IQ_SYSTEM_MAIN 과는 다른 공간이다. 주 공간에 여유가 많아도 임시 공간이 부족하면 같은 오류가 난다. 오류 메시지의 DBspace 이름을 먼저 확인한다.
임시 공간은 세션이 끝나면 반환되므로, 특정 시각에만 터진다면 그 시간대에 도는 무거운 쿼리가 원인이다.
SELECT DBSpaceName, DBSpaceType, Writable FROM sp_iqdbspace();
SELECT * FROM sp_iqdbspaceinfo();
SELECT * FROM sp_iqstatus();
sp_iqdbspace 로 각 DBspace 의 전체 크기와 사용률을, sp_iqspaceused 로 지금 쓰고 있는 임시 공간 양을 본다. 어느 연결이 임시 공간을 많이 쓰는지는 다음으로 본다.
SELECT * FROM sp_iqconnection();
가장 직접적인 방법이다. 서비스를 멈추지 않고 온라인으로 붙일 수 있다.
ALTER DBSPACE IQ_SYSTEM_TEMP ADD FILE temp02 '/iqdata/temp02.iqtmp' SIZE 50000;
크기 단위는 MB 다. 파일을 둘 파일 시스템에 실제로 그만큼의 여유가 있어야 한다. 파일 시스템이 먼저 가득 차면 DB 오류 대신 OS 오류가 난다.
이미 있는 파일을 키울 수도 있다.
ALTER DBSPACE IQ_SYSTEM_TEMP ALTER FILE temp01 SIZE 80000;
공간을 늘리는 것은 시간을 버는 일이고, 같은 쿼리가 다시 돌면 또 터진다. 임시 공간을 크게 쓰는 형태는 정해져 있다.
ORDER BY 나 DISTINCT 로 정렬하는 경우.SELECT * 로 끌고 오는 경우.실행 계획을 먼저 본다.
SET TEMPORARY OPTION Query_Plan = 'ON';
SET TEMPORARY OPTION Query_Detail = 'ON';
한 쿼리가 임시 공간을 전부 먹어 다른 세션까지 죽이는 것을 막는다.
SET OPTION PUBLIC.Max_Temp_Space_Per_Connection = 20971520;
값은 KB 단위다. 상한을 넘긴 세션만 실패하고 나머지는 계속 돈다.
ALTER DBSPACE ... DROP FILE 은 그 파일을 쓰는 세션이 없을 때만 된다.