SQL / SAS:从大表(2bn行)中选择的最佳性能
我在只读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; 快速执行此操作的最佳策略和代码(sql或sas)是什么? 编辑:尝试使用哈希表的罗伯特的建议,查询只运行40分钟(快10倍).感谢所有的答案! 解决方法哈希表当然!散列表可以用作连接两个表的非常快速的方法.较小的表被读入内存.通过非常快速的散列算法运行密钥(在本例中为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; Hashtables可用于SAS中的各种程序化优点,因此请务必阅读它们.他们提供的不仅仅是加入. 另外 – 确保只保留较大表中所需的列,因为这可以减少从较大的表中读取行所花费的时间. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |