数千个值的 Redshift IN 条件

Posted

技术标签:

【中文标题】数千个值的 Redshift IN 条件【英文标题】:Redshift IN condition on thousands of values 【发布时间】:2017-05-09 23:37:44 【问题描述】:

获取与大约 100k 值中的任何一个匹配的数据的最佳方法是什么?

对于这个问题,我使用的是 Amazon Redshift 数据库,并且有一个类似这样的表,其中包含数亿行:

--------------------
| userID | c1 | c2 |
| 101000 | 12 | 'a'|
| 101002 | 25 | 'b'|
____________________

还有数以百万计的唯一用户 ID。我有一个我关心的 98,000 个用户 ID 的 CSV 列表,我想对这些特定用户的列进行数学运算。

select c1, c2 from table where userID in (10101, 10102, ...)

与这样的庞大列表匹配的最佳解决方案是什么?

我的方法是制作一个 python 脚本,读取我们条件集中所有用户的结果,然后在 python 中过滤 CSV。它非常缓慢,但并非在所有情况下都有效。

一位同事建议将 98k 用户上传到一个临时表中,然后加入到查询中。这似乎是最聪明的方法,但我想问一下你们是否都有想法。

我还想知道打印一个包含所有 98k 用户的超长 SQL 查询是否可以匹配并运行它。出于好奇,它会跑吗?

【问题讨论】:

尝试按照您同事的建议上传数据。 我建议不要称它为临时表。这是一张桌子——我希望你会在某个时候再次这样做,所以把桌子放在那里,下次考虑一个可重复的过程。对于长 SQL 查询方法,您通常会发现链中的某些进程无法处理那么大的字符串。客户端工具、复制粘贴缓冲区或者可能是 redshift 本身。无论如何,您可能会发现您想对同一个数据集进行一些不同的分析,并将其放在一个表中可以实现这一点。最后,根据查询规划器,EXISTS可能INJOIN执行得更好 绝对将用户列表上传到表中是正确的方法,但如果你们中的任何人好奇,我尝试运行一个带有 98k 匹配条件的巨型 in() 语句的巨型 SQL 查询实际上会运行,并且及时。 :) 【参考方案1】:

按照您同事的建议,将您的 ID 放入临时表中,方法是将 CSV 上传到 S3,然后使用 COPY 将文件导入表中。然后,您可以使用 INNER JOIN 条件在您感兴趣的 ID 列表中过滤主数据表。

如果您无法将文件上传到 S3,另一种选择可能是使用 CREATE TEMP TABLE 为您的 ID 列表设置一个表格,然后使用电子表格生成整个 INSERT 语句以填充临时表。不过 100K 的插入可能会很慢。

【讨论】:

以上是关于数千个值的 Redshift IN 条件的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql - 超过 3000 个值的 IN 子句优化

Redshift - 在查询的“输入”部分使用 300K 的值进行查询

条件包含 IN 语句的 CASE 语句 redshift

SQL 查询 - 匹配 5 中至少 4 个值的条件

Redshift - 提取约束

有没有办法在 Redshift Spectrum 中使用“IN”条件检查多个列?