SQL/SAS:从大表(2bn行)中选择的最佳性能

Wil*_*nte 7 sql sas

我在只读S​​AS SPD服务器(bigtable)中有一个非索引的20亿行表.我的工作区(SAS_GRID)中有另外一个1200万行表,其中包含一列唯一ID(idlist).两个表都不断更新.我想基于idlist过滤bigtable,例如:

create table filtered_bigtable as
select t1.* from bigtable t1 inner join idlist t2
on t1.id = t2.id;
Run Code Online (Sandbox Code Playgroud)

快速执行此操作的最佳策略和代码(sql或sas)是什么?

编辑:尝试使用哈希表的罗伯特的建议,查询只运行40分钟(快10倍).感谢所有的答案!

Rob*_*dge 6

哈希表当然!

哈希表可以用作连接两个表的非常快速的方法.较小的表被读入内存.可以id通过非常快速的散列算法运行密钥(在本例中)来识别来自小表的任何给定行的RAM中的位置.如果您有足够的内存来保存内存中较小的表中的键,则可以避免索引的需要.只有12米的行你应该没问题.

一旦从较小的表密钥被读入内存,它只是在更大的表迭代,有违于大表中的每个ID的散列算法,看看它是否找到针对从RAM中注册的小表中的值一击,和如果是,输出行.

唯一的开销是将小表加载到内存中(非常快),以及大表中每个键的散列(非常快).存储器查找时间也可以被认为是即时的.

它非常高效,因为它只能从磁盘读取每个表一次.有效地使用索引会导致多次读取较小的表(或至少读取较小的表的索引).

data filtered_bigtable;

  set bigtable;

  if _n_ eq 1 then do;
    declare hash ht(dataset:'idlist') ;
    ht.definekey('id');
    ht.definedone();
  end;

  if ht.find() eq 0 then do;
    output;
  end;
run;
Run Code Online (Sandbox Code Playgroud)

Hashtables可用于SAS中的各种程序化优点,因此请务必阅读它们.他们提供的不仅仅是加入.

另外 - 确保只保留较大表中所需的列,因为这可以减少从较大的表中读取行所花费的时间.

  • @pinegulf这两篇文章我指的是最经常是"数据步骤哈希对象作为编程工具"(https://pdfs.semanticscholar.org/9156/3cbb2a9e12a537ac2ee7a23f9ffd87bd0f2e.pdf#)和"SAS哈希对象提示表"(HTTPS: //support.sas.com/rnd/base/datastep/dot/hash-tip-sheet.pdf#) (2认同)