INDEKSY Indeks to plik (o rozszerzeniu sas7bndx) powiązany ze zbiorem, który pozwala na bezpośredni dostęp do obserwacji. Przechowuje wartości obserwacji w porządku rosnącym oraz położenie obserwacji w zbiorze. Indeks dla powyższej tabeli: Wartość zmiennej Day Lokalizacja obserwacji (nr wiersza) Monday 1,2,3,4,5,6,7 Tuesday 8,9,10,11,12,13 Stosowanie indeksów ma swoje korzyści, ale bywa również kosztowne. korzyści szybsze przetwarzanie warunku WHERE możliwość przetwarzania w grupach bez konieczności sortowania bezpośredni dostęp do obserwacji z poziomu Data Stepu przyspieszenie niektóych zapytań w języku SQL (np. łączenia zbiorów) koszty możliwość spowolnienia niektórych operacji przestrzeń dyskowa potrzebna na przechowywanie indeksu czas potrzebny na stworzenie indeksu
Wyróżniamy Indeksy proste a. indeksujemy 1 wartość zmiennej b. nazwa indeksu taka sama jak nazwa zmiennej Przykład tworzenia indeksu prostego: options msglevel=i; *Opcja MSGLEVEL określa poziom szczegółowości wiadomości zapisanej do logu. N - uwagi (notes, stąd N), ostrzeżenia, błędy I - oprócz powyższych również indeksy, informacje na temat mergowania czy sortowania.; data libsas.indeksybl(index=(league)); set libsas.baseball_players; Indeksy złożone a. indeksujemy wartość 2 lub więcej zmiennych b. nazwa indeksu unikalna w obszarze zbioru, nie może by7ć taka jak nazwa którejkolwiek zmiennej Przykład tworzenia indeksu złożonego: options msglevel=i; data libsas.indeksyblp(index=(ind_l_p=(league position)/nomiss)); * opcja UNIQUE zapewnia unikatowosc wartosci zmiennych dla kazdej obserwacji ze zbioru, zas NOMISS sprawia, ze braki danych dla zmiennych kluczowych nie beda uwzgledniane w indeksie; set libsas.baseball_players;
Indeksy można również utworzyć za pomocą procedury PROC DATASETS albo za pomocą PROC SQL. Za pomocą tej procedury możemy również usuwać indeksy Do wyświetlania informacji o indeksach można użyć procedur PROC CONTENTS PROC DATASETS PROC DATASETS LIB=liceum; MODIFY uczniowie; INDEX CREATE nr_buta; QUIT; PROC CONTENTS data=liceum.uczniowie; PROC DATASETS LIB=liceum; MODIFY uczniowie; INDEX DELETE nr_buta; QUIT; PROC CONTENTS data=liceum.uczniowie; Ćwiczenie 25 Na zbiorze CARS_H z biblioteki LIBSAS stworzyć indeks prosty na zmiennej Type oraz indeks złożony o nazwie Type_Origin na zmiennych Type i Origin. Wyświetlić informacje o indeksach w tabeli CARS_H. Skasować stworzone indeksy. Upewnić się, że indeksy zostały skasowane. PYTANIA: 1. Jakie instrukcje pozwalają nam nawigować po DATA STEPIE. Czym się od siebie różnią? 2. Jakie jest domyślne ustawienie opcji MSGLEVEL? 3. Co zrobić żeby w logu pojawiły się informacje o indeksach? 4. Czym jest indeks? 5. Jakie znamy typy indeksów? 6. Jakie koszty i korzyści trzeba wziąć pod uwagę gdy stosuje się indeksy?
WYKORZYSTANIE INDEKSÓW Aby indeksowanie zbiorów miało sens trzeba zastanowić się nad wyborem zmiennej, na podstawie której utworzymy klucz indeksu. Jeżeli szczególnie często wyszukujemy ze zbioru informacji po jednej zmiennej, np. wiek, to to ułatwieniem będzie utworzenie indeksu prostego po tej zmiennej. Nie należy wykorzystywać zmiennych rzadko używanych, gdyż skutkuje to niepotrzebnym przechowywaniem mało używanego pliku. Najlepsze do indeksowania są zmienne, które zwracają najmniejszy podzbiór obserwacji. Które z poniższych indeksowań jest bardziej opłacalne? proc datasets library=libsas; modify serce; index delete _all_; index create AgeAtStart; proc datasets library=libsas; modify serce; index delete _all_; index create sex; Posortowanie zbioru względem zmiennej kluczowej przed utworzeniem indeksu sprawia, że otrzymany indeks szybciej wyodrębnia wskazany podzbiór. Indksy możemy wykorzystywać z instrukcjami WHERE i BY. Indeksy w instrukcji WHERE Jeżeli wyrażenie logiczne w instrukcji WHERE zawiera zmienne indeksowane, to SAS analizuje możliwość wykorzystania indeksów lub ich nieuwzględnienia, tak aby uzyskać najbardziej optymalne przetwarzanie danych. SAS rozpatruje pytania: 1. Czy zmienne w WHERE pokrywają się ze zmiennymi indeksowanymi indeksem prostym? 2. Czy któraś zmienna w WHERE pokrywa się z pierwszą zmienną indeksowaną indeksem złożonym? 3. Czy użycie indeksu zwróci podzbiór obserwacji pokrywający się z kryteriami wyboru z WHERE? 4. Czy użycie indeksu będzie bardziej efektywne niż sekwencyjne czytanie danych? 5. Czy indeks ma opcję NOMISS?
6. Czy w warunku WHERE użyty jest operator arytmetyczny (np. zm=zm1+1) lub porównywane sa zmienne (np. zm1=zm2)? Jeśli 1,3,4, to SAS wykorzystuje indeks prosty. Jeśli 2,3,4, to SAS wykorzystuje indeks złożony. Jeśli warunki są spełnione dla więcej niż jednego indeksu, to SAS wybiera ten, który zwraca najmniejszy podzbiór. Jeśli nie są spełnione 1,3,4 lub 2,3,4, to SAS wybiera przetwarzanie sekwencyjne. Jeśli 5 lub 6, to SAS wybiera przetwarzanie sekwencyjne. Ćwiczenie 26 Spójrz na poniższe przykłady. W którym z nich do optymalizacji WHERE użyto indeksu? Dlaczego? Przykład 1 proc datasets library=libsas; *podajemy biblioteke; modify serce; *podajemy tabele; index delete _all_; *usuwamy wszystkie indeksy; index create sex; *tworzymy indeks prosty na zmiennej sex; data serce; *w bibliotece tymczasowej work tworzymy tabele serce; set libsas.serce; where sex="male";
Przykład 2 data libsas.class; set sashelp.class; proc datasets library=libsas; modify class; index delete _all_; index create sex; data class; *w bibliotece tymczasowej work tworzymy tabele serce; set libsas.class; where sex="f";
Ćwiczenie 27 Stwórz w tabeli libsas.serce indeks prosty na takiej zmiennej, by został on użyty przy optymalizacji WHERE.