对大量项目使用 IN 条件
Using IN Condition with large number of items
我有来自外部数据库的带有 ID 的本地数据。然后我想 select 使用这些 id 从外部数据库获取数据,所以我会做类似的事情:
SELECT * FROM table WHERE id IN (:listofids)
但是我注意到(我不确定它是按 DB 设置还是 DB 类型或什么的 DB)该 IN 语句中允许的值的最大数量。如果可能,我当然会 WHERE id IN (SELECT id FROM ...)
但有时使用外部数据是不可能的。
我的问题:
- 除了我在上面所做的之外,我还有什么选择?
- 最大项目的限制是在数据库级别设置的,数据库的类型,什么?现在我特别关注外部 RedShift 数据库,但我查看了他们的文档,他们没有提到限制。我们的本地数据库限制为 2100,但我使用的另一个限制是 9999。此外,一旦列表变大,它就会变慢,所以我也在寻找性能提升。
- 我应该
in () OR in () OR in()
。这似乎不太光滑。所有这些选项都可行吗?
- 我已经阅读了一些关于可能使用临时 tables 来执行此操作的内容,但没有任何示例。我如何将数据加载到临时 table 中,然后加入我想从中获取数据的 table?
一个非常简单的解决方案,可以避免临时 tables,就是做这样的事情:
SELECT
t.*
FROM
[table] t
INNER JOIN (
SELECT 'id1' AS id
UNION ALL
SELECT 'id2'
UNION ALL
SELECT 'id3') i ON i.Id = t.Id;
使用大量 UNION 创建子查询显然要多做一些工作,但这有效地创建了一个临时 table,您可以使用它而不必担心具体化它。
What are my options here besides what I am doing in the above?
它们是有限的 - 您可以链接一长串 OR id = X
调用,但与 IN
相比,您可能会遇到严重的性能问题。
最佳 选项在性能方面是加入 table(参数、临时、CTE、内联 UNION
或静态)服务器端。但是,这并不总是一个选项,具体取决于您执行查询的方式和您拥有的权限。
当然,您也可以为每个值执行一个单独的查询,这会更容易编码,但也可能存在性能问题。
Are the limitations of max items set at the DB level, the type of DB, what?
这是特定于平台的,因此没有通用的答案
Should I do in () OR in () OR in(). That doesn't seem too slick. Are all of these options viable?
这是一个可以添加到上面其他选项的选项 - 您必须尝试一下才能了解对性能的影响。
I've read a bit about possibly using temp tables to do this but without any examples. How would I load data into a temp table to then join into the table I'm wanting to get the data from?
这取决于平台、您的权限、您的 API 可用等。
我有来自外部数据库的带有 ID 的本地数据。然后我想 select 使用这些 id 从外部数据库获取数据,所以我会做类似的事情:
SELECT * FROM table WHERE id IN (:listofids)
但是我注意到(我不确定它是按 DB 设置还是 DB 类型或什么的 DB)该 IN 语句中允许的值的最大数量。如果可能,我当然会 WHERE id IN (SELECT id FROM ...)
但有时使用外部数据是不可能的。
我的问题:
- 除了我在上面所做的之外,我还有什么选择?
- 最大项目的限制是在数据库级别设置的,数据库的类型,什么?现在我特别关注外部 RedShift 数据库,但我查看了他们的文档,他们没有提到限制。我们的本地数据库限制为 2100,但我使用的另一个限制是 9999。此外,一旦列表变大,它就会变慢,所以我也在寻找性能提升。
- 我应该
in () OR in () OR in()
。这似乎不太光滑。所有这些选项都可行吗? - 我已经阅读了一些关于可能使用临时 tables 来执行此操作的内容,但没有任何示例。我如何将数据加载到临时 table 中,然后加入我想从中获取数据的 table?
一个非常简单的解决方案,可以避免临时 tables,就是做这样的事情:
SELECT
t.*
FROM
[table] t
INNER JOIN (
SELECT 'id1' AS id
UNION ALL
SELECT 'id2'
UNION ALL
SELECT 'id3') i ON i.Id = t.Id;
使用大量 UNION 创建子查询显然要多做一些工作,但这有效地创建了一个临时 table,您可以使用它而不必担心具体化它。
What are my options here besides what I am doing in the above?
它们是有限的 - 您可以链接一长串 OR id = X
调用,但与 IN
相比,您可能会遇到严重的性能问题。
最佳 选项在性能方面是加入 table(参数、临时、CTE、内联 UNION
或静态)服务器端。但是,这并不总是一个选项,具体取决于您执行查询的方式和您拥有的权限。
当然,您也可以为每个值执行一个单独的查询,这会更容易编码,但也可能存在性能问题。
Are the limitations of max items set at the DB level, the type of DB, what?
这是特定于平台的,因此没有通用的答案
Should I do in () OR in () OR in(). That doesn't seem too slick. Are all of these options viable?
这是一个可以添加到上面其他选项的选项 - 您必须尝试一下才能了解对性能的影响。
I've read a bit about possibly using temp tables to do this but without any examples. How would I load data into a temp table to then join into the table I'm wanting to get the data from?
这取决于平台、您的权限、您的 API 可用等。