STROJENIE PRZETWARZAŃ SAS PIOTR BEDNARCZYK, ORANGE POLSKA S.A. Copyright 2014, SAS Institute Inc. All rights reserved.
WSTĘP AGENDA Analiza logów przetwarzań Obiekt Hash DATA STEP czy PROC SQL? Podzapytania Łączenie danych z różnych baz danych Podstawy optymalizacji i podsumowanie Q&A
ANALIZA LOGÓW WŁASNE NARZĘDZIE Ruby + Fox 40 linii kodu Łatwe wyszukiwanie najdłuższych kroków przetwarzań
OBIEKT HASH OPIS Obiekt typu Hash umożliwia przechowywanie danych w pamięci RAM oraz dostęp do nich za pomocą kluczy Podstawowe cechy: Szybkie wyszukiwanie (Hash) i odczyt (RAM) danych Zamiana i usuwanie danych z hashmap Domyślnie klucz może występować tylko raz (można to zmienić wiele danych do jednego klucza) Główne zastosowanie: złączenia, agregacje Możliwość zapisu zawartości do zbioru SAS
OBIEKT HASH PRZYKŁAD: ZŁĄCZENIE MAŁEJ TABELI Z DUŻĄ Złączenie join za pomocą sql zamieniamy na tworzenie tabeli pośredniej za pomocą hashmapy 1. Za pomocą hashmapy utworzenie małej tabeli będącej fragmentem dużej 2. Złączenie dwóch małych tabel Przykład (tabela mała 60tys wierszy, duża 112mln wierszy): Złączenie join 23 minuty Złączenie za pomocą hashmapy (łącznie z utworzeniem tabeli pośredniej) 6 minut
OBIEKT HASH PRZYKŁAD: NAKŁADANIE PRZYROSTÓW Zamiana merge (wymagane sortowanie dwóch tabel) na złączenie z hashmapą Przykład mała tabela (nowe dane) 60tys wierszy, duża 17mln wierszy Merge 27 minut Hashmapa 5 minut
DATA STEP CZY PROC SQL PRZYKŁAD: ZŁĄCZENIA ZA POMOCĄ LIKE Cel: wyszukiwanie danych po prefiksach IP Data MB 10.100.25.16 2013-03-01 3 194.195.43.16 2013-03-03 6 10.100.26.17 2013-03-05 2 194.195.41.42 2013-03-01 8 175.203.20.12 2013-03-03 9 10.101.79.11 2013-03-05 11 Najwygodniej: Prefix 10.% 194.195.41% 35.192.34% proc sql; create table wybrane as select ip,data,mb from polaczenia, prefiksy where ip like prefix;
DATA STEP CZY PROC SQL PRZYKŁAD: ZŁĄCZENIA ZA POMOCĄ LIKE proc sql; create table prefix2 as select trim(transtrn(prefix,'%','')) as prefix from prefix; data wybrane; length IP $16; length data $40; length mb $40; if _N_ = 1 then do; declare hash h(dataset: "work.prefix2"); h.definekey('prefix'); h.definedone(); end; set polaczenia; do i=1 to length(ip); prefix=substr(ip,1,i); rc = h.find(); if (rc = 0) then output; drop rc i; end; Oryginalny kod: 1h50min Po optymalizacji: 2min
DATA STEP CZY PROC SQL PRZYKŁAD: ZŁĄCZENIE WARUNKOWE ZE SŁOWNIKIEM Cel: złączenie danych ze słownikiem z uwzględnieniem dodatkowych warunków zapisanych w SQL proc sql; create view work.widok as select t.*, coalesce(c,.) as WES from ( select MONOTONIC( ) as _lp,* from work.tabela ) t left join work.slownik l on t.identyfikator = l.identyfikator and ( srednia >= min and srednia <= max ) order by _lp ; quit; data work.tabelas (drop= _lp _WES ); length _WES 8; retain _WES; set work.tmp_lkp; by _lp; if first._lp then do; _WES = WES; end; if _WES < WES then do; _WES = _WES; end; else do; _WES = WES ; end; if last._lp then do; WES = _WES; output; end; data work.tabelan; set work.tabela; kolejny=_n_; proc sql; create table work.tymcz as select t.kolejny, min(c) as WES from work.tabelan t left join work.slownik l on t.identyfikator = l.identyfikator and ( srednia >= min and srednia <= max) group by t.kolejny; quit; proc sort data=tymcz; by kolejny; data work.tabelas; merge work.tabelan work.tymcz; drop kolejny; Oryginalny kod: 30min Po optymalizacji: 2min
PODZAPYTANIA PRZYKŁAD: ZŁĄCZENIE Z WYKLUCZENIEM Cel: złączenie tabel tabela1 i tabela2 z wykluczeniem rekordów z tabela3 tabela1 1,1mln wierszy tabela2 150tys wierszy tabela3 8000 wierszy proc sql; create table wynik as select tab1.* from tabela1 as tab1, tabela2 as tab2 where tab1.klucz=tab2.klucz and not exists (select tab3.klucz from tabela3 as tab3 where tab3.klucz=tab1.klucz) proc sql; create table tabela2tmp as select * from tabela2 where klucz not in (select klucz from tabela3); create table wynik as select tab1.* from tabela1 as tab1, tabela2tmp as tab2 where tab1.klucz=tab2.klucz Oryginalny kod: 1 godz 40min Po optymalizacji: 15sekund
RÓŻNE BAZY DANYCH PRZYKŁAD: POŁĄCZENIE SAS Z HURTOWNIĄ DANYCH Zadanie: W SAS mamy tabelę 100tys wierszy, na hurtowni danych 70mln Cel: złączenie tabel Oryginalne rozwiązanie (czas 1h40min): Złączenie tabel w SAS za pomocą jednego proc sql Optymalizacja (czas 5min): Skopiowanie kolumn z kluczem z SAS na hurtownię Wykonanie złączenia na hurtowni, skopiowanie fragmentu tabeli do SAS Złączenie w SAS Cały kod zawierał 6 takich złączeń łączna optymalizacja około 9h
PODSUMOWANIE O CZYM NALEŻY ZAWSZE PAMIĘTAĆ Ram jest tani, wykorzystujmy go poprzez hashe Przetwarzajmy tylko niezbędne dane (usuwamy zbędne wiersze i kolumny ze zbiorów) Przetwarzajmy dane tam, gdzie już są nie kopiujemy pomiędzy bazami Wykorzystujmy mocne strony języka SAS4GL Narzędzie to nie wszystko Sprawdzajmy różne podejścia nie zawsze oczywiste jest najlepsze
Q&A Copyright 2014, SAS Institute Inc. All rights reserved.