查询正在teradata中输出假脱机

查询正在teradata中输出假脱机,teradata,Teradata,我正在执行下面的查询,但一个查询给了我结果,另一个查询给了我[Error 2646][SQLState HY000]用户中没有更多的假脱机空间 SELECT DISTINCT PARTITION FROM DB.TABLE ORDER BY PARTITION ASC; Error:-[Error 2646] [SQLState HY000] No more spool space in USER. 但当我执行时,它会给我结果:- select * from (

我正在执行下面的查询,但一个查询给了我结果,另一个查询给了我[Error 2646][SQLState HY000]用户中没有更多的假脱机空间

 SELECT DISTINCT PARTITION
    FROM  DB.TABLE 
     ORDER BY PARTITION  ASC;

Error:-[Error 2646] [SQLState HY000] No more spool space in USER.
但当我执行时,它会给我结果:-

 select * from (
 SELECT DISTINCT PARTITION
    FROM  DB."TABLE") x
    ORDER BY X.PARTITION ASC;

Teradata的优化器通常检查
不同的
是否可以使用
分组方式重写(反之亦然)

在您的第一个查询中,它选择了独特的处理(即重新分配,然后进行排序),因为排序是由
(当然这是愚蠢的)

使用
DISTINCT
的派生表将不会被折叠,即优化器将具体化它。如果没有
独特的
,它将应用聚合重写,这将执行AMP本地聚合作为第一步,从而大大减少假脱机的使用

如果将
COUNT(*)
添加到#1,它将不会输出并返回有用的信息:)


另一方面,如果我想知道有数据的分区,我会查询
dbc.Stats
..

不同的
是否可以使用
分组方式
重写(反之亦然)

在您的第一个查询中,它选择了独特的处理(即重新分配,然后进行排序),因为排序是由
(当然这是愚蠢的)

使用
DISTINCT
的派生表将不会被折叠,即优化器将具体化它。如果没有
独特的
,它将应用聚合重写,这将执行AMP本地聚合作为第一步,从而大大减少假脱机的使用

如果将
COUNT(*)
添加到#1,它将不会输出并返回有用的信息:)


另一方面,如果我想知道有数据的分区,我会查询
dbc.Stats
..

@dnoeth…非常感谢您提供的宝贵信息。实际上,第一个查询是由TDCH(Teradata connector for hadoop)创建的,所以我运行了第二个查询来检查它是否有效。我的表很大,是用MVC压缩的,有240 GB的数据。我无法查询统计数据,因为查询是由TDCH内部生成和执行的。但我的理解是,在第二种情况下,第一个不同的分区将被搜索,然后按done排序,这样就避免了数据的重新分布,对不对??@anwaar_hell:Yep,DISTINCT在删除重复项之前会重新分发所有行,而GROUP BY在重新分发之前会删除重复项。@dnoeth…非常感谢您提供的宝贵信息。实际上,第一个查询是由TDCH(Teradata connector for hadoop)创建的,所以我运行了第二个查询来检查它是否有效。我的表很大,是用MVC压缩的,有240 GB的数据。我无法查询统计数据,因为查询是由TDCH内部生成和执行的。然而,我的理解是,在第二种情况下,第一个不同的分区将被搜索,然后按done排序,这样就避免了数据的重新分发,对不对???@anwaar_hell:Yep,distinct在消除重复之前重新分发所有行,而GROUP by在重新分发之前移除重复项。