SAS多个大表连接 - 错误:排序执行失败

时间:2014-11-05 11:48:37

标签: sql performance sas

运行表单的大型查询时(使用未指定的_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,t3t4 ... 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也会导致类似的问题。

如何分析此查询?

  • 帮助我选择更好的策略
  • 使我能够对整个数据集执行操作
  • 限制文件系统上需要过多的I / O(即我可以批处理并将结果联合起来)

1 个答案:

答案 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上可能发生的任何排序。

如果连接返回多行,则无法工作;它会产生错误。