运行表单的大型查询时(使用未指定的_method
输出查询方法):
PROC SQL _method; CREATE TABLE output AS
SELECT
t1.foo
,t2.bar
,t3.bat
,t4.fat
,t5.baa
FROM table1 t1
LEFT JOIN table t2
ON t1.key2 = t2.key2
LEFT JOIN table3 t3
ON t1.key3 = t3.key3
LEFT JOIN table t4
ON t1.key4 = t4.key4
...
LEFT JOIN tablen tn
ON t1.keyn = tn.keyn
;
其中t1
是ca. 6 Gb,t2
是一张桌子上的视图。 500 Gb,t3
,t4
... tn
是每个数据表ca. 1-10 Mb(通常有六个或七个),我遇到以下错误:
注意:使用了SAS线程排序。错误:排序执行失败。
注意:查看WORK.table2.VIEW使用(总处理时间): 实时17:02.55 用户cpu时间2:40.12 SAS系统
system cpu time 2:19.41 memory 303785.64k OS Memory 322280.00k Timestamp 11/03/2014 08:13:25 PM
当我对t1
的非常小的一部分进行采样时,使其仅为ca. 30 Mb查询运行正常,但即使10%的table1也会导致类似的问题。
如何分析此查询?
答案 0 :(得分:2)
首先,这是一个非常大的数据集,问题可能与视图有关。其次,如果数据在数据库中,您可能需要传递查询,因此在数据库端完成所有处理。
如果left join
只是查找值,特别是单个值,则可以将查询重新命名为:
SELECT t1.foo,
(SELECT t2.bar FROM table t2 WHERE t1.key2 = t2.key2) as bar,
(SELECT t3.bat FROM table t3 WHERE t1.key3 = t3.key3) as bat,
. . .
FROM table1 t1;
这应该消除table1
上可能发生的任何排序。
如果连接返回多行,则无法工作;它会产生错误。