Меня немного смущает использование индексов в SAS.
Я нашел 2 способа их реализации:
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:
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*;