Ograniczanie wyników w PROC SQL

Próbuję użyć PROC SQL do odpytywania tabeli DB2 z setkami milionów rekordów. Na etapie rozwoju chcę uruchomić moje zapytanie na arbitralnie małym podzbiorze tych rekordów (powiedzmy, 1000). Próbowałem użyć INOBS, aby ograniczyć obserwacje, ale uważam, że ten parametr ogranicza po prostu liczbę rekordów, które przetwarza SAS. Chcę, aby SAS pobierał tylko dowolną liczbę rekordów z bazy danych (a następnie przetwarzał je wszystkie).

If I were writing a Zapytanie SQL sam, chciałbym po prostu użyć SELECT * FROM x FETCH FIRST 1000 ROWS ONLY ... (odpowiednik SELECT TOP 1000 * FROM x W Sql Server). Ale PROC SQL nie ma takiej opcji. Pobieranie płyt zajmuje bardzo dużo czasu.

Pytanie: Jak mogę polecić SAS arbitralnie ograniczyć liczbę rekordów do zwracanych z bazy danych .

Czytałem, że PROC SQL używa ANSI SQL, który nie ma żadnej specyfikacji dla słowa kluczowego ograniczającego wiersz. Być może SAS nie chciał się starać, aby przetłumaczyć jego składnię SQL na słowa kluczowe specyficzne dla dostawcy? Nie ma żadnej pracy?

Author: Vogel612, 2012-07-31

2 answers

Gdy SAS rozmawia z bazą danych za pomocą składni SAS, część zapytania może być przetłumaczona na odpowiednik języka DBMS - nazywa się to niejawnym przejściem. Reszta zapytania jest "przetworzona" przez SAS w celu uzyskania ostatecznego wyniku. W zależności od wersji SAS, DBMS vendor i DBMS version, a w niektórych przypadkach nawet niektóre opcje połączenia / libname, różne części składni SAS są tłumaczone / uważane za zgodne między SAS i DBMS, a tym samym wysyłane do wykonania przez DBMS zamiast SAS.

Z opcjami SAS SQL-INOBS i OUTOBS-pracowałem dużo z MS SQL i Oracle za pośrednictwem różnych wersji SAS, ale nie widziałem te kiedykolwiek przetłumaczone na top XXX typu zapytań, więc prawdopodobnie nie jest to jeszcze obsługiwane, chociaż gdy zapytanie dotyka tylko dane DMBS (bez łączy do danych SAS itp), powinno być całkiem wykonalne.

Więc myślę, że zostajesz z tak zwaną explicit pass - through-specyficzną składnią SAS SQL, aby połączyć się z bazą danych. Tego typu zapytania wyglądają jak to:

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;

W SAS 9.3 składnia może być uproszczona-jeśli istnieje już połączenie LIBNAME, możesz użyć go ponownie do jawnego przejścia:

LIBNAME ORALIB ORACLE user=...;

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

Podczas łączenia przy użyciu libname należy użyć READBUFF (Zwykle ustawiam około 5000) lub INSERTBUFF (1000 lub więcej) podczas ładowania bazy danych.

Aby sprawdzić, czy ma miejsce implicit pass-through, ustaw opcję sastrace:

option sastrace=',,,ds' sastraceloc=saslog nostsuffix;
 7
Author: vasja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-31 20:02:24

Czy próbowałeś użyć opcji outobs w swoim proc sql?

Na przykład,

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

Alternatywnie, możesz użyć SQL passthrough do napisania zapytania przy użyciu składni DB2 (FETCH FIRST 10 ROWS ONLY), chociaż wymaga to przechowywania wszystkich danych w bazie danych, przynajmniej tymczasowo.

Passthrough wygląda mniej więcej tak:

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;

Wymaga więcej składni i nie może uzyskać dostępu do zbiorów danych sas, więc jeśli outobs działa dla Ciebie, polecam to.

 27
Author: stevepastelan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-31 19:30:25