SAS index 索引

最近在处理数据量较大的项目时,应用到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

原文地址:https://www.cnblogs.com/Anni-love-Ferris-wheel/p/7686842.html