Индексы в PROC DATASETS, PROC SQL для библиотек SAS и ORACLE - PullRequest
0 голосов
/ 29 мая 2018

Я немного запутался в использовании индексов в 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*;

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Вы захотите изучить опцию SASTRACE= ( 9,2 документа ), которая будет регистрировать, что делает механизм удаленной библиотеки.Я ожидал бы, что движок сделает свой собственный неявный переход к простым соединениям.Движок автоматически переведет некоторые функции SAS и группировки в эквиваленты на стороне Oracle.

Если вы не можете заставить сервер работать должным образом, для небольших наборов идентификаторов (пара тысяч) рассмотрите код, генерирующий список 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;

Если идентификаторы являются символами, генератор кода должен будет quote() значения в выборе.

0 голосов
/ 29 мая 2018

Относительно

Если я перенесу свою тестовую таблицу в библиотеку оракула, эти запросы будут все еще медленными (я не могу индексировать ее в этом случае из-за ограничений, но это только одно наблюдение).

Как вы перешли в Oracle?ps ORACLELIB не является действительным libref SAS, поэтому я предполагаю, что это псевдокод.

Взгляните на SAS / ACCESS® 9.4 для реляционных баз данных: справочник, девятое издание , Пример: создание и объединение постоянной таблицы и временной таблицы.

В примере представлены dbmstemp=yes опция libname и

, показывающие, как использовать эту опцию для создания постоянной ивременной таблицы, а затем объединить их в запросе.

Вы также можете загрузить данные таблицы тестирования в таблицу TEMP сеанса подключения, а затем выбрать набор результатов с помощью сквозного SQL-запроса.Сквозной запрос позволит вам иметь полный контроль над запросом, включая специфические для хоста функции (например, подсказки Oracle, которые принудительно используют индекс), которые механизм удаленной библиотеки SAS может не использовать.

Независимо от способа соединения,межсистемная передача, вероятно, является одним из наиболее трудоемких аспектов.Вы хотите найти способ, который выполняет большую часть работы с наименьшим количеством переводов.

0 голосов
/ 29 мая 2018

На самом деле, существует 3 способа создания индекса в SAS:

  1. Proc Datasets / Modify / Index Create
  2. опция набора данных (index =) и
  3. Proc SQL / Create Index

AFAIK, первые два являются единственным способом указания опций в дополнение к Unique.

Ответ на вопрос, как сделатьБолее быстрое объединение, вероятно, потребует сочетания (сквозной) обработки в вашей Oracle БД и предварительной / последующей обработки в SAS.И может включать или не включать создание индексов.

Это будет зависеть от:

  • a) от того, где находятся ваши данные и от размера (ов) данных, и
  • b) что вы пытаетесь достичь с точки зрения результата.

Можете ли вы предоставить больше информации?

РЕДАКТИРОВАТЬ: нормально, большой стол в Oracle, маленький стол в SAS небольшая таблица является драйвером выходных строк

Не зная абсолютных деталей, причина, по которой ваш запрос был медленным, имела мало общего с индексами, а скорее с тем фактом, что вы «перетаскивали» данные избольшая таблица Oracle для удовлетворения запроса.

Легко исправить, как в последнем предложении обновленного ответа Ричарда: перенести небольшую таблицу в Oracle ...

Для ясности перенестинебольшую таблицу в Oracle, выполните запрос там и сохраните результаты там.При необходимости используйте соответствующие средства передачи для экспорта данных в SAS ...

...