首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PROC数据集中的索引、用于SAS的PROC SQL和ORACLE库

问PROC数据集中的索引、用于SAS的PROC SQL和ORACLE库
EN

Stack Overflow用户
提问于 2018-05-29 10:19:45
回答 3查看 833关注 0票数 0

我对SAS中索引的使用有点困惑。

我找到了两种实现它们的方法:

使用PROC

代码语言:javascript
复制
CREATE <UNIQUE> INDEX index-name 
 ON table-name ( column <, ... column>);  

使用PROC数据集

代码语言:javascript
复制
proc datasets library=college;
   modify survey;
      index create class;
      index create major;
run;

proc datasets library=college;
   modify maillist;
      index create zipid=(zipcode schoolid);
run;

proc datasets library=college;
   modify student;
      index create idnum / unique;
run;

proc datasets library=college;
   modify student;
      index create religion / nomiss;
run;

我的第一个问题是,他们做同样的事吗?我假设他们会这样做,但考虑到文档似乎没有交叉引用它们,并且nomiss在PROC SQL中没有选择,我有一些疑问。

我的第二个问题是,如果我有Oracle库和SAS库,那么在ORACLE中定义的索引与在SAS中定义的索引之间的关系是什么?

以下查询运行得非常快,因为该表是在Oracle DB中索引的:

代码语言:javascript
复制
PROC SQL;
  SELECT * FROM ORACLELIB.MY_TABLE
  WHERE RELATION_ID = 1097;
QUIT;

但是,如果我试图对位于我的WORK库中的1列、1条观察和索引表执行一个简单的内部连接,那么查询需要花费大量的时间:

代码语言:javascript
复制
data TEST;
   input RELATION_ID;
   datalines;
   1097
;

proc datasets library=WORK;
   modify TEST;
      index create RELATION_ID;
run;

PROC SQL;
  SELECT * FROM ORACLELIB.MY_TABLE t1
  INNER JOIN TEST t2
  ON t1.RELATION_ID = t2.RELATION_ID;
QUIT;

这也是缓慢的:

代码语言:javascript
复制
PROC SQL;
  SELECT * FROM ORACLELIB.MY_TABLE t1
  WHERE RELATION_ID IN (SELECT RELATION_ID FROM TEST);
QUIT;

我还试图在oracle库中创建我的测试表,该库不位于同一个oracle服务器上):

代码语言:javascript
复制
data ORACLELIB2.TEST;
   input RELATION_ID;
   datalines;
   1097
;

这似乎同样缓慢(在本例中,由于限制,我无法对其进行索引,但这只是一个观察)。

这就引出了我的最后一个问题,我怎样才能让这个连接运行的速度达到应有的速度?

补充说明:

我有3台服务器:

  • 我无法编写的主要ORACLE服务器,它包含以MY_TABLE为特征的库
  • 另一个ORACLE服务器,我可以在那里编写。
  • 一个SAS服务器,在这里我可以编写

我的主要用途是以下类型的查询:

代码语言:javascript
复制
CREATE TABLE NEWTABLE AS
SELECT *columns* FROM smaller_table t1 LEFT JOIN MY_TABLE t2
ON t1.RELATION_ID = t2.RELATION_ID and t1.other_col = t2.other col
WHERE *additional restrictions on t2*;
EN

回答 3

Stack Overflow用户

发布于 2018-05-29 10:56:49

您将需要研究SASTRACE=选项(9.2博士),该选项将记录远程库引擎正在做的事情。我原以为引擎会对简单的联接进行自己的隐式传递。引擎将自动将一些SAS函数和分组子句转换为Oracle方面的等价物。

如果您无法使服务器端以预期的快速方式操作,对于少量in ({两千}),请考虑生成IN列表的代码,并查看其性能是否更好。

代码语言:javascript
复制
proc sql noprint;
  select relation_id into :id_list separated by ',' from test;

  SELECT * FROM ORACLELIB.MY_TABLE t1
  WHERE RELATION_ID IN (&id_list);
quit;

如果ids是字符,则代码生成器必须对选择中的值进行quote()。

票数 2
EN

Stack Overflow用户

发布于 2018-05-29 10:48:22

实际上,在SAS中创建索引有三种方法

  1. Proc数据集/修改/索引创建
  2. 数据集选项(index=),以及
  3. Proc SQL/ Create索引

除了Unique之外,前两种方法都是指定选项的唯一方法。

如何使连接更快的答案可能涉及Oracle DB中的(Pass)处理和SAS中的前后处理的组合。也可能不涉及创建索引。

这取决于:

  • ( a)你的资料所在及资料大小,及
  • 从结果上看,你要达到什么目的。

你能提供更多的信息吗?

编辑:好,Oracle中的大表,SAS中的小表,小表是输出行的驱动程序。

在不知道绝对细节的情况下,查询速度慢的原因与索引无关,而是与“从大型Oracle表中”提取数据以满足查询这一事实有关。

很容易修复,根据Richard更新的答案的最后一句:将小表转移到Oracle.

要清除,请将小表传输到Oracle,在那里运行查询并将结果保存在那里。如果需要,使用适当的传输设施将数据导出到SAS .

票数 1
EN

Stack Overflow用户

发布于 2018-05-29 13:00:17

关于

如果我将我的测试表移到oracle库中,这些查询仍然很慢(在本例中,由于限制,我无法对其进行索引,但这只是一个观察)。

你是怎么搬到甲骨文的?附注:ORACLELIB不是一个有效的SAS,所以我猜这是伪代码。

看看关系数据库的SAS/ACCESS 9.4 :参考,第九版,例如:创建并加入一个永久表和一个临时表。

该示例具有dbmstemp=yes libname选项和

演示如何使用此选项创建永久表和临时表,然后将它们连接到查询中。

还可以将测试表数据上载到连接会话临时表中,然后通过传递SQL查询选择结果集。传递查询将允许您完全控制查询包含特定于主机的特性(例如,Oracle提示强制索引使用),而SAS远程库引擎可能不使用这些功能。

不管连接方式如何,系统间的传输可能是最耗时的方面之一。您希望找到在最少的传输上执行最多工作的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50581907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档