Я немного запутался в использовании индексов в SAS.
Я нашел 2 способа их реализации:
с PROC SQL
CREATE <UNIQUE> INDEX index-name
ON table-name ( column <, ... column>);
с наборами данных PROC
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:
PROC SQL;
SELECT * FROM ORACLELIB.MY_TABLE
WHERE RELATION_ID = 1097;
QUIT;
Но если я попытаюсь выполнить простое внутреннее объединение для индексированной таблицы с 1 столбцом, 1 наблюдением, расположенной в моей библиотеке WORK
, запрос займет очень много времени:
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;
Я также пытался создать свою тестовую таблицу в библиотеке оракула, которая не находится на том же сервере оракула):
data ORACLELIB2.TEST;
input RELATION_ID;
datalines;
1097
;
Это кажется таким же медленным (в этом случае я не могу проиндексировать его из-за ограничений, но это только одно наблюдение).
Что приводит к моему последнему вопросу, что я могу сделать, чтобы запустить это соединениетак быстро, как должно?
Дополнительные примечания:
У меня есть 3 сервера:
- основной сервер ORACLE, где я не могу написать, который содержитбиблиотека с MY_TABLE
- Другой сервер ORACLE, на котором я могу писать.
- Сервер SAS, на котором я могу писать
Моим основным использованием будут запросы следующихтип:
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*;