在内部连接的proc sql结束时排序错误

时间:2013-08-06 16:59:56

标签: sas

我运行了以下代码,一小时后,就像代码完成排序执行错误一样。我的代码是否有问题,或者我的计算机处理器和Ram不足

proc sql;

create table today as

select a.account_number, a.client_type, a.device ,a.entry_date_est,

    a.entry_time_est, a.duration_seconds, a.channel_name, b.esn, b.service_start_date,

    b.service_end_date, b.product_name, b.billing_frequency_fee, b.plan_category,

    b.plan_subtype, b.plan_type

    from listen_nomiss a  inner join service_nomiss b

    on (a.account_number = b.account_number)

    order by account_number;

quit;

2 个答案:

答案 0 :(得分:3)

当您用完实用程序空间以执行排序时,最常见到该错误。 this SAS KB post提供了一些故障排除建议。最有用的建议:

  • options fullstimer msglevel=i ;会为您提供有关幕后情况的更多信息,以便您解决导致问题的原因
  • proc options option=utilloc; run;会告诉您实用程序目录在哪里,您的临时文件将被创建用于排序。验证最终表所需空间大约是可用空间的3倍 - 排序需要大约3倍的空间,以便根据排序的处理方式对数据集进行正确排序。
  • 如果尚未启用,
  • OPTIONS COMPRESS;将节省一些(可能很多)空间。

options memsize;options sortsize;将告诉您为SAS分配了多少内存,以及在内存和磁盘上进行排序的大小。 sortsize应约为memsize的1/3(考虑到需要3倍的空间来处理它)。如果您的决赛桌位于sortsize左右,如果默认值太低(memsize相同),您可能最好尝试增加sortsize

您还可能遇到一些权限问题; kb文章中的其他一些建议涉及验证您实际上是否有权写入实用程序目录,或者它是否存在。

答案 1 :(得分:1)

我过去曾经有过一个项目,资源也是一个问题。 排序时有两种方法:

  • 不要忘记proc sort有一个TAGSORT选项,它将首先对by语句变量进行排序,然后附加其他所有内容。当有许多列没有参与by语句时很有用。
  • 索引:如果你在by-statement中构建一个确切变量的索引,你可以使用不带排序的by语句,它将依赖索引。
  • 拆分:您可以将数据集拆分为多个块,并分别对每个块进行排序。然后,您执行数据步骤,将它们全部放在set语句中。当你在那里使用by语句时,SAS会编织记录,结果也是根据by-statement。

请注意,这些方法会有性能损失(可能只是在较小程度上是第三种),如果您以后不考虑它们(或故意销毁它们),索引会让您头疼。

如果/当您将整个联接重写为SAS合并时,请注意:请记住,SAS合并本身并不模仿多对多联接。 (它一对一,一对多和多对一)可能不是这里的情况(很少),但我提到它是安全的。