teradata中no more spool space
刚上线的TD跑批作业,有些会报“no more spool space”这样的错误,开发人员第一反应,分配的数据库空间不足了。
其实基本都是跑批作业程序本身问题。
先要解决这个问题,得先了解下什么是spool空间。
TD数据库平台有三类空间,分别是:
PERM:用户用于存放永久性数据的磁盘空间。每一个数据库在创建时,都会预分配存储空间。
SPOOL:用于存放各类请求运行过程中所产生的中间结果集的空间。在创建每一个TD用户时,都会分配一个限额。
TEMP:用于存放TEMPORARY表数据的空间。在创建每一个TD用户时,都会分配一个限额。
其中SPOOL是磁盘临时表空间,用于在查询处理期间保存中间行,以及保存事务的应答集中的行。
由于TD数据库的特性,加入分配了200G的临时表空间,在具有24个AMPS上系统上,每个AMP上大概分配了,大约8.3G临时空间。
由于上述的这个特性,很容易猜到出现no more spool space这个原因之一是:
1).表的PI设计不当,数据严重倾斜,导致数据集中在某个AMP上过多,超出了这个8.3G的空间限制。
另外一个常见原因是:
2).表关联时,关联条件写错。出现笛卡尔积,产生大量无用的结果集,超过了临时空间限制。
还有就是产生的临时表数据确实太大超过了限制,不过这个很少出现。
遇到这个错误,就要具体分析问题,针对是哪种情况具体解决了。
可以通过:SELECT DISTINCT 或者SELECT/GROUP BY查询中间结果集来具体确定问题。