Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SAS Proc SQL在合并时是否使用过索引_Sql_Performance_Indexing_Sas - Fatal编程技术网

SAS Proc SQL在合并时是否使用过索引

SAS Proc SQL在合并时是否使用过索引,sql,performance,indexing,sas,Sql,Performance,Indexing,Sas,考虑下面的例子(诚然很长) 示例代码创建了两个数据集,一个是带有“关键”变量i、j、k的数据集,另一个是带有关键变量j、k和“值”变量x的数据集。我希望尽可能高效地合并这两个数据集。这两个数据集都是关于j和k的索引:第一个数据的索引应该不需要,但它仍然存在 procsql在datatwo中不使用索引,我认为如果数据在关系数据库中,就会出现这种情况。这只是我必须接受的查询优化器的一个限制吗 编辑:这个问题的答案是肯定的,SAS可以使用索引优化PROC SQL连接。在下面的示例中,数据集的相对大小很

考虑下面的例子(诚然很长)

示例代码创建了两个数据集,一个是带有“关键”变量i、j、k的数据集,另一个是带有关键变量j、k和“值”变量x的数据集。我希望尽可能高效地合并这两个数据集。这两个数据集都是关于j和k的索引:第一个数据的索引应该不需要,但它仍然存在

procsql在datatwo中不使用索引,我认为如果数据在关系数据库中,就会出现这种情况。这只是我必须接受的查询优化器的一个限制吗

编辑:这个问题的答案是肯定的,SAS可以使用索引优化PROC SQL连接。在下面的示例中,数据集的相对大小很重要:如果修改代码使数据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;
*仅用于控制数据的大小;
%设j_max=10000;
*创建数据集;
数据一;
i=1到3;
do j=1至&j_max;
do k=1到4;

如果ranuni(0)你可能在比较苹果和橙子。对于使用
proc-sql
进行的连接,索引可能没有帮助,因为观察结果已经按j和k排序,并且有比使用索引更快的“合并”方法

另一方面,对于使用
data\u null\u
步骤进行的子集设置,
j
上的索引肯定会有所帮助。如果对
proc sql
执行相同的子集设置,您将看到它正在使用索引

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

有关更多信息,请参阅Paul Kent's。

谢谢,特别是查询计划技巧+1.您链接到的注释说procsql可以使用索引,这是个好消息。我将尝试随机化观察的顺序,看看是否可以让优化器选择索引。
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 )
*/