我在只读SAS SPD服务器( bigtable )中有一个非索引的20亿行表。我的工作区中有另外1200万行表(SAS_GRID),其中包含一列唯一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倍)。谢谢你的所有答案!
答案 0 :(得分:5)
当然是哈希表!
哈希表可以用作连接两个表的非常快速的方法。较小的表被读入内存。通过非常快速的哈希算法运行密钥(在本例中为class Something extends React.Component {
constructor(props) {
super(props);
this.handleDelete = this.handleDelete.bind(this);
}
handleDelete() {
console.log('handleDelete');
const { something } = this.state;
confirm({
title: 'Are you sure you want delete?',
content: 'Press Ok to continue, Cancel to return',
onOk: () => {
console.log('onOK')
this.setState({ something: [] })
},
onOkWithoutArrow: function(){
this.setState({..});
}.bind(this);
});
}
render() {
return <Component onClick={this.handleDelete} />;
}
}
),可以识别小表中任何给定行的RAM位置。如果您有足够的内存来保存内存中较小的表中的键,则可以避免索引的需要。只有12米的行你应该没问题。
一旦来自较小表的密钥被读入内存,它只是遍历较大的表,对大表中的每个id运行散列算法,以查看它是否找到了来自注册的小表中的值的命中RAM,如果是,则输出该行。
唯一的开销是将小表加载到内存中(非常快),以及大表中每个键的散列(非常快)。内存查找时间也可以考虑为即时。
它非常高效,因为它只是从磁盘读取每个表。有效地使用索引会导致多次读取较小的表(或者至少读取较小的表的索引)。
id
哈希表可用于SAS中的各种程序化优点,因此请务必阅读它们。他们提供的不仅仅是加入。
另外 - 请确保只保留较大表中所需的列,因为这样可以减少从较大的表中读取行所花费的时间。
答案 1 :(得分:0)
您希望确保将要过滤的列编入索引。我对PROC SQL不太好(我使用SQL Server的次数更多)。在您的情况下,您正在过滤t1.id.您希望确保该列已编入索引。
PROC SQL;
CREATE INDEX ID
ON BIGTABLE(ID);
RUN;
同样,您可能希望继续查看第二个表的索引。
答案 2 :(得分:0)
据我记得,SPDS在加入牌桌时效率一直很低。如果您可以将这些12M ID加载到内存中,创建格式并在where条件下使用它将是我的首选。
我认为SAS声称几年前他们让SPDS在传递中使用用户定义的格式,但没有SAS顾问能够告诉我如何使这些格式在put
或input
中工作{1}}功能。尽管如此,即使你阅读bigtable并在SPDS之外进行过滤,它也会比megre join(想象排序bigtable)或散列连接更快(SPDS可以并行读取记录但是散列连接在单个线程中运行,就我而言记住)。
编辑:如果您需要创建格式并在where子句中使用它的示例,请告诉我。
答案 3 :(得分:0)
我觉得这种方法应该很快,但这是纯粹的直觉,让我们知道哪种方法最快。
PROC SQL;
create table filtered_bigtable as
select t1.* from bigtable as t1
where t1.id in (select distinct id from t2)
;
QUIT;