gpt4 book ai didi

SQL/SAS : Best performance for selecting from big table (2bn rows)

转载 作者:行者123 更新时间:2023-12-04 12:04:07 25 4
gpt4 key购买 nike

我在只读 SAS 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 倍)。感谢所有的答案!

最佳答案

当然是哈希表!

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

一旦小表中的键被读入内存,它就简单地遍历大表,对大表中的每个 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;

哈希表可用于 SAS 中的各种编程优势,因此请务必仔细阅读它们。他们提供的不仅仅是连接。

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

关于SQL/SAS : Best performance for selecting from big table (2bn rows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47168148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com