Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL半序结果_Sql_Performance_Amazon Web Services_Presto_Amazon Athena - Fatal编程技术网

SQL半序结果

SQL半序结果,sql,performance,amazon-web-services,presto,amazon-athena,Sql,Performance,Amazon Web Services,Presto,Amazon Athena,我在AmazonAthena(一个Presto引擎)中有一些用户事件的表,其中包括userId(VARCHAR)和ts(timestamp,BIGINT)列。这张桌子相当大,有几亿张唱片。我想创建一个查询,按ts列对事件进行排序。我很快发现我不能使用全局ORDER BY ts,因为这意味着所有ts值都应该存储在单个工作节点的内存中,这会导致内存不足类型错误 关键是,实际上我不需要对这些事件进行全局排序,如果为单个用户ID排序就足够了。我还尝试使用一个复合查询,其中外部查询获取所有唯一的useri

我在AmazonAthena(一个Presto引擎)中有一些用户事件的表,其中包括userId(VARCHAR)和ts(timestamp,BIGINT)列。这张桌子相当大,有几亿张唱片。我想创建一个查询,按ts列对事件进行排序。我很快发现我不能使用全局
ORDER BY ts
,因为这意味着所有ts值都应该存储在单个工作节点的内存中,这会导致内存不足类型错误


关键是,实际上我不需要对这些事件进行全局排序,如果为单个用户ID排序就足够了。我还尝试使用一个复合查询,其中外部查询获取所有唯一的userid,而内部查询使用一个
where userid=current\u userid
子句,但由于我有大约50k个不同的userid,因此此查询运行的时间太长。(如前所述,将查询结果连接在一起的
操作与此相同)。我正在寻找一些只部分使用对行排序的sql构造,类似于按ts排序(按用户ID划分)
(此子句无效)。

您似乎在寻找:

ORDER BY RANK() OVER (PARTITION BY userid ORDER BY ts)
然而,我不确定这是否真的会限制你们工人的内存消耗。你需要测试一下

我很快发现我不能使用ts的全局顺序,因为这意味着所有ts值都应该存储在单个工作节点的内存中,这会导致内存不足类型错误

Presto支持分布式排序已经一年多了(由Starburst提供)。分布式排序无需将所有数据放在一个节点的内存中,因此允许对排序操作进行线性缩放。节点越多,可以排序的数据越多,而不会影响性能(不涉及磁盘/存储)

我不认为有任何方法可以强制较旧的Presto版本在不将所有数据放入一个节点内存的情况下有效地进行总排序。因此,在Athena本机支持分布式排序之前,您无法在用户端进行补偿

您可以从以下网站获得最新的Presto版本:


由于您在AWS上,所以可以使用在Amazon上进行一次单击(好的,实际上是“几次单击”)部署。(我来自Starburst)。

问题是,查询末尾的
ORDER BY
子句将始终应用于结果集中的所有记录。您可能需要将结果集读入应用程序并在其中排序。或者,添加索引以加快排序速度。您能在这里包含您正在运行的实际查询吗?是的,我确认它没有减少内存消耗。。。现在,它尝试将结果集按来自
RANK()