我对SAS中索引的使用有点困惑。
我找到了两种实现它们的方法:
CREATE <UNIQUE> INDEX index-name
ON table-name ( column <, ... column>); 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中索引的:
PROC SQL;
SELECT * FROM ORACLELIB.MY_TABLE
WHERE RELATION_ID = 1097;
QUIT;但是,如果我试图对位于我的WORK库中的1列、1条观察和索引表执行一个简单的内部连接,那么查询需要花费大量的时间:
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;这也是缓慢的:
PROC SQL;
SELECT * FROM ORACLELIB.MY_TABLE t1
WHERE RELATION_ID IN (SELECT RELATION_ID FROM TEST);
QUIT;我还试图在oracle库中创建我的测试表,该库不位于同一个oracle服务器上):
data ORACLELIB2.TEST;
input RELATION_ID;
datalines;
1097
;这似乎同样缓慢(在本例中,由于限制,我无法对其进行索引,但这只是一个观察)。
这就引出了我的最后一个问题,我怎样才能让这个连接运行的速度达到应有的速度?
补充说明:
我有3台服务器:
我的主要用途是以下类型的查询:
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*;发布于 2018-05-29 10:56:49
您将需要研究SASTRACE=选项(9.2博士),该选项将记录远程库引擎正在做的事情。我原以为引擎会对简单的联接进行自己的隐式传递。引擎将自动将一些SAS函数和分组子句转换为Oracle方面的等价物。
如果您无法使服务器端以预期的快速方式操作,对于少量in ({两千}),请考虑生成IN列表的代码,并查看其性能是否更好。
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()。
发布于 2018-05-29 10:48:22
实际上,在SAS中创建索引有三种方法
除了Unique之外,前两种方法都是指定选项的唯一方法。
如何使连接更快的答案可能涉及Oracle DB中的(Pass)处理和SAS中的前后处理的组合。也可能不涉及创建索引。
这取决于:
你能提供更多的信息吗?
编辑:好,Oracle中的大表,SAS中的小表,小表是输出行的驱动程序。
在不知道绝对细节的情况下,查询速度慢的原因与索引无关,而是与“从大型Oracle表中”提取数据以满足查询这一事实有关。
很容易修复,根据Richard更新的答案的最后一句:将小表转移到Oracle.
要清除,请将小表传输到Oracle,在那里运行查询并将结果保存在那里。如果需要,使用适当的传输设施将数据导出到SAS .
发布于 2018-05-29 13:00:17
关于
如果我将我的测试表移到oracle库中,这些查询仍然很慢(在本例中,由于限制,我无法对其进行索引,但这只是一个观察)。
你是怎么搬到甲骨文的?附注:ORACLELIB不是一个有效的SAS,所以我猜这是伪代码。
看看关系数据库的SAS/ACCESS 9.4 :参考,第九版,例如:创建并加入一个永久表和一个临时表。
该示例具有dbmstemp=yes libname选项和
演示如何使用此选项创建永久表和临时表,然后将它们连接到查询中。
还可以将测试表数据上载到连接会话临时表中,然后通过传递SQL查询选择结果集。传递查询将允许您完全控制查询包含特定于主机的特性(例如,Oracle提示强制索引使用),而SAS远程库引擎可能不使用这些功能。
不管连接方式如何,系统间的传输可能是最耗时的方面之一。您希望找到在最少的传输上执行最多工作的方法。
https://stackoverflow.com/questions/50581907
复制相似问题