Ограничение результатов в proc SQL

Я пытаюсь использовать proc SQL для запроса таблицы DB2 с сотнями миллионов записей. На этапе разработки я хочу запустить свой запрос на сколь угодно малом подмножестве этих записей (скажем, 1000). Я попытался использовать INOBS для ограничения наблюдений, но я считаю, что этот параметр просто ограничивает количество записей, которые обрабатывает SAS. Я хочу, чтобы SAS извлекал только произвольное количество записей из базы данных (а затем обрабатывал их все).

Если бы я был написав SQL-запрос самостоятельно, я бы просто использовал SELECT * FROM x FETCH FIRST 1000 ROWS ONLY ... (эквивалент SELECT TOP 1000 * FROM x в SQL Server). Но у PROC SQL, похоже, нет такой опции. Это занимает очень много времени, чтобы принести записи.

вопрос: Как я могу поручить SAS произвольно ограничить количество записей до возвращение из базы данных.

Я читал, что PROC SQL использует ANSI SQL, который не имеет никакой спецификации для ключевого слова ограничения строки. Возможно, SAS этого не сделал хотите приложить усилия, чтобы перевести его синтаксис SQL на ключевые слова конкретного поставщика? Здесь нет работы?

2 ответов


когда SAS разговаривает с базой данных через синтаксис SAS, часть запроса может быть переведена на эквивалент языка СУБД - это называется неявным пропуском. Остальная часть запроса" обрабатывается " SAS для получения конечного результата. В зависимости от версии SAS, поставщика СУБД и версии СУБД, а в некоторых случаях даже некоторых параметров соединения / libname, различные части синтаксиса SAS переводимы / считаются совместимыми между SAS и СУБД и, таким образом, отправляются для выполнения СУБД вместо САС.

С SAS SQL options-INOBS и OUTOBS-я много работал с MS SQL и Oracle через разные версии SAS, но я не видел, чтобы они когда-либо переводились на верхний тип запросов xxx, поэтому это, вероятно, еще не поддерживается, хотя когда запрос касается только данных DMBS (нет соединений с данными SAS и т. д.), должно быть вполне выполнимо.

поэтому я думаю, что вы остались с так называемым явным синтаксисом SQL SAS для подключения к базе данных. Такие запросы выглядят вот так:

proc sql;
    connect to oracle as db1 (user=user1 pw=pasw1 path=DB1);
    create table test_table as
    select *
    from connection to db1
        ( /* here we're in oracle */
                  select * from test.table1 where rownum <20 
                )
    ;
    disconnect from db1;
quit;

в SAS 9.3 синтаксис может быть упрощен - если уже есть соединение LIBNAME, вы можете использовать его для явного прохождения:

LIBNAME ORALIB ORACLE user=...;

PROC SQL;
connect to oracle using ORALIB;
create table work.test_table as
        select *
        from connection to ORALIB (
....

при подключении с помощью libname обязательно используйте READBUFF (обычно я устанавливаю около 5000 или около того) или INSERTBUFF (1000 или более) при загрузке базы данных.

чтобы увидеть, имеет ли место неявный проход, установите параметр sastrace:

option sastrace=',,,ds' sastraceloc=saslog nostsuffix;

вы пробовали использовать в своем proc sql?

например,

proc sql outobs=10; create table test
    as
    select * from schema.HUGE_TABLE
    order by n;
quit;

кроме того, вы можете использовать SQL passthrough для написания запроса с использованием синтаксиса DB2 (FETCH FIRST 10 ROWS ONLY), хотя для этого требуется сохранить все ваши данные в базе данных, по крайней мере временно.

Passthrough выглядит примерно так:

proc sql;
    connect to db2 (user=&userid. password=&userpw.  database=MY_DB);

    create table test as
    select * from connection to db2 (
        select * from schema.HUGE_TABLE
        order by n
        FETCH FIRST 10 ROWS ONLY
    );
quit;

он требует большего синтаксиса и не может получить доступ к наборам данных sas, поэтому, если outobs работает для вас, я рекомендую что.