最近在處理數據量較大的項目時,應用到index索引與HASH對象的結合使用,總結一下對index作為建索引的相關知識點
1.概念
索引:索引是一種輔助的數據結構,通過一個或者多個關鍵變量來直接指向觀測。SAS索引有兩類,簡單索引:只基於一個變量的值,索引名自動等於關鍵變量名;復合索引:基於多於一個的關鍵變量,需自定義唯一的名稱
2.什么情況使用索引
雖然索引可以看成指向數據的快捷方式,但是索引的開銷相當高,包括磁盤空間的開銷及處理等,所以要考慮建立索引的情況:
訪問的觀測遠遠小於總體
用於BY語句引用已排序的變量
3.如何建索引
3.1 DATA步
/*簡單索引*/
DATA A(INDEX=(age));
SET SASHELP.CLASS;
RUN;
/*復合索引*/
DATA B(INDEX=(A_W=(AGE WEIGHT)));
SET SASHELP.CLASS;
RUN;
3.2 PROC SQL步
PROC SQL;
DROP INDEX AGE FROM A;
CREATE INDEX AGE ON A(AGE);/*簡單索引*/
CREATE INDEX A_W ON A(AGE,WEIGHT);/*復合索引*/
QUIT;
3.3 PROC DATASETS
PROC DATASETS LIB=<libname>;
MODIFY <datasetname>;
INDEX CREATE <index_name>/<NOMISS> <UNIQUE>
<UPDATECENTILES=ALWAYS|NEVER|integer>
RUN;
這里:
libname:邏輯庫名稱
Datasetname:數據集名稱
Index_name:索引名,可以是一個關鍵變量名,也可以是自定義的變量名,但需要指定對應哪幾個變量
選項中:
NOMISS:從索引中排除所有索引變量缺失值的觀測
UNIQUE:指定索引變量或者變量組合必須是唯一的
UPDATECENTILES:指定數據值更新多少時,索引也隨之更新,可以是總是更新|從不更新|設定的百分比10(表示10%),默認是5(percent)
LIBNAME S ‘.’;
/*簡單索引;指定對S邏輯庫下A數據集,以AGE為關鍵變量建索引*/
PROC DATASETS LIB=S;
MODIFY A;
INDEX CREATE AGE;
RUN;
/*復合索引:三個關鍵變量括號里的順序為關鍵次序,A_W_H是唯一的索引名*/
PROC DATASETS LIB=S;
MODIFY A;
INDEX DELETE AGE;/*刪除索引*/
INDEX CREATE A_W_H=(AGE,WEIGHT,HEIGHT);
RUN;
需要注意的是,如果原有的索引已經存在,必須先刪除,再重新建立
4. OPTIONS MSGLEVEL=N|I;查看索引的使用情況
N:僅打印NOTES、WARNING、ERROR信息,系統的默認選項。
I:打印N選項的信息,同時打印附屬信息,包括索引的使用、合並處理、排序等附加信息。
5.SAS不使用索引的情況
(1) DATA步使用IF語句取子集
(2)WHERE 表達式只有部分包含關鍵變量
(3)SAS檢測出順序讀取數據更有效率
6.示例:實現對年齡的分組,組內排序
結果:
參考文檔:http://blog.163.com/shen_960124/blog/static/6073098420136161844551/和SAS help