請考慮下面的(無可否認的長)示例。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;
非常感謝,尤其是查詢計劃技巧。 +1。您鏈接到的說明表示Proc SQL可以使用索引,這是個好消息。我會嘗試隨機化觀察順序,看看是否可以讓優化器選擇索引。 – 2009-10-12 18:06:28