2009-10-12 48 views
2

請考慮下面的(無可否認的長)示例。SAS Proc SQL在合併時是否曾經使用過索引

示例代碼創建兩個數據集,其中一個帶有「關鍵」變量i,j,k和數據2,具有關鍵變量j,k和一個「值」變量x。我想盡可能有效地合併這兩個數據集。這兩個數據集都相對於j和k進行索引:第一個數據的索引不應該被需要,但它仍然存在。

Proc SQL不會在數據2中使用索引,如果數據在關係數據庫中,我認爲會這樣。這只是我不得不接受的查詢優化器的限制嗎?

編輯:這個問題的答案是肯定的,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; 

回答

6

你可能會比較蘋果和橘子。對於您使用proc sql進行的連接,索引可能無法幫助,因爲觀察值已經按j和k進行了排序,並且比使用索引有更快的「合併」方法。

對於您使用data _null_步驟進行的子集設置,另一方面,j上的索引肯定會有所幫助。如果您使用proc sql執行相同的子集,您將會看到它使用索引

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

順便說一句,你可以使用無證_method選項來研究如何proc sql執行查詢。在我的SAS 9.2在Windows上,報告說,它是做什麼的被稱爲「散列連接」:

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) 
*/ 

看到了保羅肯特的Tech note以獲取更多信息。

+1

非常感謝,尤其是查詢計劃技巧。 +1。您鏈接到的說明表示Proc SQL可以使用索引,這是個好消息。我會嘗試隨機化觀察順序,看看是否可以讓優化器選擇索引。 – 2009-10-12 18:06:28