SAS EG - 按日期拆分的单个数据集与包含所有日期的单个附加数据集

SAS EG - Individual Datasets split by date vs Single appended dataset containing all dates

主要是效率问题,我对SAS处理数据集的方式不熟悉。我 运行 从具有连续日期的多个数据集中读取的很多代码(这是否连续 months/quarters/years 取决于数据集)。

目前,代码每次都需要手动更新 运行 以确保它们选择了正确的日期,所以我会有一些东西,例如:

Data Quarters;
Set XYZ_201803
    XYZ_201806
    ...
    ...
    XYZ_202006;
Run;

为了帮助整理代码并让它变得不那么乏味,我提出了一些不同的想法,并按照我的方式发送了一些想法,其中一个重要的想法是存储所有 XYZ_YYYYMM 数据集作为一个单独的附加数据集,因此可以使用以下日期的简单过滤器从中读取它们:

Data Quarters;
Set AppendedData;
Where Date > 201812;
Run;

就计算而言,这两个选项中哪个更有效?对于通常大小为几 GB 的数据集,您会推荐哪个?每个想法还有哪些其他优点和缺点?

感谢您的任何意见。 :)

兴趣点:

  • 从编码的角度来看
    • 处理通过附加季度数据集创建的单个堆叠数据集效率更高。
  • 从资源的角度来看
    • 必须确保您有足够大的磁盘来容纳单个大文件 table
    • 有额外的存储空间来保存原始片段 -- 无需将所有片段塞满主数据磁盘。
    • 2TB SSD 速度非常快、非常便宜且功耗低,并且可以包含 table 由相当多的“几 GB”块组成。
      • 旋转磁盘具有更低的 $/TB 和更大的容量。 I/O 会更慢,更耗电。

为了进一步提高查询性能,您需要为 BYCLASSWHERE 语句中最常用的变量建立索引。

“...简单过滤器...”是“保持简单 S****”(KISS) 的一部分

从性能的角度来看,单个数据集和几个单独的数据集很可能是相似的;打开新数据集会有一些小的开销,但只要不是数千个,您可能不会注意到差异。

创建该数据集和使用该数据集时,如果您仅使用通常是小部分。通常,单独的数据集很常见,人们通常对各个季度进行分析,很少将它们组合起来。

最后,如果数据集的内容每个季度都不同(如果格式可以改变,如果字段可以改变),那么在某些方面分开比管理不同数据集之间的变化更容易期间。

也就是说,单个数据集有巨大的组织好处,并且可以处理上述所有问题。将 SAS 数据集视为大型 SQL tables - 它们实际上是相同的,帮助 SQL tables 的相同事物也可以帮助 SAS。列的适当大小、存储数据的适当排序、适当的索引都是重要的解决方案。如果您的工作地点有数据库团队,他们也许能够帮助构建一个理想的 table 计划。几 GB 的文件绝对可以从索引和适当的排序中受益,让用户可以轻松地找到他们需要的位。

如果您要使用单独的数据集,您可以使用宏语言来确保您正在阅读正确的数据集,假设它们以一致的方式命名。如果有其他原因保持独立,这可能是理想的解决方案 - 那么每个季度都不需要更改。