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

时间:2017-11-07 21:59:37

标签: sql sas

我在只读S​​AS 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倍)。谢谢你的所有答案!

4 个答案:

答案 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顾问能够告诉我如何使这些格式在putinput中工作{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;