English 中文(简体)
SAS 在合并时,卡片一直使用指数
原标题:Does SAS Proc SQL ever use an index when merging
  • 时间:2009-10-12 08:25:42
  •  标签:

The following (admittedly long) example.

样本代码生成两个数据集,一个数据是“关键”变量,一、j、k,两个数据是关键变量j、k和“价值”变量x。 我愿尽可能有效地合并这两个数据集。 这两套数据集都与j和k有关:不应需要第一套数据索引,而应推向该指数。

在数据二中,Proc没有使用该指数,如果数据在KQ数据库中,我会认为该指数。 难道这只是限制我必须接受的问候最佳者吗?

http://www.un.org。 这个问题的答案是,《联合国系统会计准则》可以使用一个指数,优化加入《PROCQ》。 在以下例子中,数据集的相对规模是: 如果你修改该代码,使数据2比数据1大,则使用索引。 无论数据集是否分类,都无关紧要。

* Just to control the size of the data;
%let j_max=10000;

* Create data sets;
data one;
    do i=1 to 3;
        do j=1 to &j_max;
            do k=1 to 4;
                if ranuni(0)<0.9 then output;
            end;
        end;
    end;
run;

data two;
    do j=1 to &j_max;
        do k=1 to 4;
            x=ranuni(0);
            if ranuni(0)<0.9 then output;
        end;
    end;
run;

* Create indices;
proc datasets library=work nolist;
    modify one;
    index create idx_j_k=(j k);
    modify two;
    index create idx_j_k=(j k) / unique;
run;quit;

* Test the use of an index for the other data set:
* Log should display "INFO: Index idx_j_k selected for WHERE clause optimization.";
options msglevel=i;
data _null_;
    set two(where=(j<100));
run;

* Merge the data sets with proc sql - no index is used;
proc sql;
    create table onetwo as
    select
        one.*,
        two.x
    from one, two
    where
        one.j=two.j and
        one.k=two.k;
quit;
最佳回答

你可以比较 app和 or。 如果与你一起使用<代码>proc sql,该指数可能无法发挥作用,因为观察已经由j和k订购,而且“合并”的方法比使用指数要快。

而另一方面,关于<代码>j的索引肯定会有所帮助。 如果你对<条码>proc sql作同样的规定,你将使用该索引is/em>。

proc sql;
  select * from two where j < 100;
quit;
/* on log
INFO: Index idx_j_k selected for WHERE clause optimization.
*/

这样,你就可以使用无证<代码>_method的备选办法来审查proc sql如何执行你的询问。 在我关于窗户的9.2页上,它报告说,它正在做所谓的“ash子”:

proc sql _method;
  create table onetwo as
  select
    one.*,
    two.x
  from one, two
  where
    one.j=two.j and
    one.k=two.k;
quit;

/* on log
NOTE: SQL execution methods chosen are:

  sqxcrta
      sqxjhsh
          sqxsrc( WORK.ONE )
          sqxsrc( WORK.TWO )
*/

见Paul Kent s

问题回答

暂无回答




相关问题