Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何根据所需的“工作”大小优化proc SQL的组?_Sql_Performance_Group By_Sas_Diskspace - Fatal编程技术网

如何根据所需的“工作”大小优化proc SQL的组?

如何根据所需的“工作”大小优化proc SQL的组?,sql,performance,group-by,sas,diskspace,Sql,Performance,Group By,Sas,Diskspace,根据Joe的建议,以下是工作示例代码: data test; format id 5. group1 1. group2 1. group3 1. data $1. valid_from ddmmyy10. valid_till ddmmyy10.; input id group1 group2 group3 data $ valid_from yymmdd8. valid_till yymmdd8.; datalines; 10001 1 0 0 A 2013010120131231

根据Joe的建议,以下是工作示例代码:

data test;
format id 5. group1 1. group2 1. group3 1. data $1. valid_from ddmmyy10. valid_till ddmmyy10.;
input id  group1  group2  group3  data $ valid_from yymmdd8.  valid_till yymmdd8.;
datalines;
10001 1 0 0 A 2013010120131231
10001 0 1 1 B 2013010120130701
10001 0 1 1 C 2013070120131231
10002 1 1 0 D 2013010120131231
10002 0 1 1 E 2013010120130101
;run;
对于每个组,我都需要一个标志,指示在共享属于该组的ID的条目中,valid from的最小值是否等于valid till的最大值。给出的示例:ID 10002在组3中只有一个有效条目,即第5个条目。因此,组3中ID为10002的所有有效项的最小有效_-from(这里只有一个项)可能更等于最大有效_-till,因此我需要一个标志。以下代码适用于小数据集,但不适用于磁盘空间不足的大数据集

proc sql; create table test2 as select id, group1, group2, group3, data, valid_from, valid_till, 
case when min(valid_from+100000000*(1-group1))=max(valid_till-100000000*(1-group1)) then 1 else 0 end as flag_1 format 1.,
case when min(valid_from+100000000*(1-group2))=max(valid_till-100000000*(1-group2)) then 1 else 0 end as flag_2 format 1.,
case when min(valid_from+100000000*(1-group3))=max(valid_till-100000000*(1-group3)) then 1 else 0 end as flag_3 format 1.
from test group by id;quit;
问题是:这在工作库上需要多少可用磁盘空间?理想情况下是数据集大小的倍数,因为实际数据集要大得多。倍数是否取决于组数?我不明白为什么应该这样做,但有人建议这样做


附加问题:如何提高运行时/光盘使用率?提高磁盘使用率的一种方法是仅将组、id和日期变量(而不是相关数据本身)存储在单独的数据集中,并将标志合并回原始数据。

由于group by+甚至有更多空间用于将原始数据与摘要结果自合并,因此所需的排序操作将占用您的空间

我会:

PROC SUMMARY data=LIB.A min max nway;
class ID;
var Var1 Var2 ... Var10;
output out=WORK.MIN_MAX (drop=_freq_ _type_ )
      min(Var1)=minVar1
      max(Var1)=maxVar1....;
RUN;

data =WORK.MIN_MAX;
   set =WORK.MIN_MAX;
   flag_1 = minVar1 = maxVar1;
   ....
   flag_10 = minVar10 = maxVar10;
run;


proc sql;/* or SORT data */
create index ID on LIB.A;
create index ID on WORK.MIN_MAX;
quit;

data LIB.B;
   merge lib.A WORK.MIN_MAX;
   by ID;
run;

您收到了什么错误消息?你能把它寄出去吗?SAS中有许多不同类型的资源可能已经耗尽

你的压缩打开了吗

options compress=yes;
在运行查询之前,受影响的SAS库中有多少可用空间?你能腾出大量的空间吗

我不确定Proc摘要是否比Proc sql更有效。他们两人都在做同样的事情,但还是试一试。你需要一个有效的解决方案。它不一定要漂亮


如果所有这些都失败了,那么尝试垂直或水平拆分查询。

为什么需要这么多标志?这似乎是一个低效的过程。实际上,您将数据与自身合并大约10次,因此需要大量空间。@reese那么,如果我从任何表中选择*、maxa、maxb、max c,它会将数据与自身合并3次吗?这确实是非常低效的,但这真的会发生吗?在我看来,这可以而且应该通过一次合并来完成……我将投票结束这一过程,并建议其他人也这样做,直到你改变这个问题。现在看来,你并不是在问一个可以回答的问题;你太笼统了。我建议您删除上面的所有文本,并将问题重新表述为:我有这样的数据[示例数据,显示数据的10-20行]。我需要对它执行此过程[用英语解释,并包括它现在如何工作的代码]。我怎样才能在10GB的数据上做到这一点,而不清除我那可怜的硬盘呢?这是一个可以回答的问题,但就目前而言,这是一个混乱的局面,尽管文本墙并不包含回答这个问题所需的全部信息。为了清楚起见,我并不是建议删除这个问题:只是把它编辑成一个更好的问题。@Joe我明白你的意思,明天将用一个工作示例代码重新表述这个问题。正如我提到的,我目前的解决方法就是这样。我将需要的变量存储在不同的数据集中,并将其与原始数据集合并。IMHO,这不是一个解决方法,这是您应该做的-而不是将其推到单个数据集中,效率低下的步骤。对于排序,我发现了这一点,因为源和目标位于不同的磁盘上,所以我预计需要站点上提到的工作目录中数据集大小的两倍,而不是四倍。排序需要的空间要大得多。对于空间需求,通常建议假设为三倍。这在有关SORTSIZE选项的SAS文档中有说明。然后再加上你正在做的额外工作,4x对我来说是合理的。@user1965813,你需要忘记一些想法,比如在访问数据库时编写代码的自然方式。您需要了解数据库引擎如何处理代码,而不是开发人员最容易处理的代码。数据库中性能最好的代码远比大多数开发人员希望看到的复杂。然而,在数据库中,尤其是在您所说的H大小的数据库中,性能远比可维护性重要,您需要了解如何编写性能良好的代码作为第一选择。过一段时间,这类代码看起来自然而简单。刷新计算机窗口可以看到,磁盘空间已经用完,可用空间从前面提到的40GB减少到0。之后是“资源不足”对话框,可以选择取消提交的语句或退出SAS。