1

我正在寻找有关我遇到的 SAS/SQL 性能问题的一些指导。在 SAS Enterprise Guide 中,我创建了一个创建表的程序。该表有大约 90k 行:

CREATE TABLE test AS (
  SELECT id, SUM(myField)
  FROM table1
  GROUP BY id
)

我有一个更大的表,有数百万行。每行都有一个id。我想对这个表的值求和,只使用“测试”表中的 id。我试过这个:

CREATE TABLE test2 AS(
  SELECT big.id, SUM(big.myOtherField)
  FROM big
  INNER JOIN test
    ON test.id = big.id
  GROUP BY big.id
)

我遇到的问题是,对具有数百万条记录的大表运行第二个查询需要很长时间。我认为 id 子集的内部连接会有所帮助(也许确实如此),但我想确保我正在尽我所能加快速度。

我没有任何方法可以获取有关基础数据库索引的信息。我更感兴趣的是获得比我拥有更多 SQL 和 SAS 经验的人的意见。

4

2 回答 2

1

从您在问题中显示的内容来看,您正在加入两个 SAS 数据集,而不是两个数据库对象。在任何情况下,您都可以通过在每个表中使用的 JOIN 列上定义索引来加快处理速度。假设您有权这样做,以下是示例:

proc sql;
   create index id on big(id);
   create index id on test(id);
quit;

当然,您可能应该在执行此操作之前先检查表定义。您可以使用“describe”语句查看结构:

proc sql;
   describe table big;
quit;

索引以磁盘空间和更新维护为代价提高了访问性能。创建后,索引将成为 SAS 数据集的永久部分,如果您使用 SQL INSERT 或 DELETE 语句,将自动更新。但请注意,如果您使用简单的数据步骤重新创建数据集,则会删除索引。

另一方面,如果这些表确实位于外部数据库(例如 Oracle)中,您将面临不同的挑战。如果是这种情况,我会提出一个新问题并提供您正在使用的 SAS 代码的完整示例(包括和 libname 语句)。

于 2013-07-09T18:38:12.623 回答
0

如果您使用的是非 SAS 数据,即驻留在 SQL 数据库或非 SQL 数据库中的数据,您将看到使用直通 SQL 的性能显着提高,或者,如果支持并且您拥有许可证对于它,数据库内处理。

关于 proc sql 与 pass-through sql 的重要一点。默认情况下,Proc sql 在执行工作之前会在 SAS 数据集中创建原始源数据的副本。而传递只是从源数据提供者请求结果集。简而言之,你可以想象一个有 500 万行的表与 proc sql 一起使用(即使你只对大约 1% 的数据感兴趣)比你只需要提取那 1% 的数据要花费更长的时间使用直通机制跨网络。

于 2014-08-01T18:09:11.887 回答