繁体   English   中英

SAS企业指南/ SQL性能

[英]SAS Enterprise Guide / SQL Performance

我正在寻找有关SAS / SQL性能问题的一些指导。 在《 SAS企业指南》中,我创建了一个创建表的程序。 该表约有9万行:

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经验的人更感兴趣。

根据问题所显示的内容,您正在联接两个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代码的完整示例(包括and libname语句)。

如果您使用的是非SAS数据,即驻留在SQL DB或无SQL数据库中的数据,则使用直通SQL或如果获得许可并拥有许可证,则将看到性能的显着提高。为此,数据库内处理。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM