从大量ID中进行SQL选择

4 投票
4 回答
1708 浏览
提问于 2025-04-15 23:43

我有一个表格,叫做 Foo。我在 Foo 上运行一个查询,想从中获取一些特定的 ID。接下来,我想对这些 ID 进行一系列更复杂的查询。有没有什么高效的方法可以做到这一点?我想到的最好办法就是构造一个很大的 "IN" 条件,比如:

SELECT ... --complicated stuff
WHERE ... --more stuff
  AND id IN (1, 2, 3, 9, 413, 4324, ..., 939393)

也就是说,我要构建一个庞大的 "IN" 条件。这种做法效率高吗?有没有更好的方法,还是说唯一的办法就是和最初获取 ID 的查询进行连接?顺便提一下,我使用 SQLObject 来连接 PostgreSQL 数据库,并且我可以使用执行查询以获取所有 ID 的游标。

更新:我应该提到,这些复杂的查询都依赖于这些 ID,或者是生成更多的 ID 来在其他查询中查找。如果我做一个大查询,我可能会一次性连接六个表,这样可能会太慢。

4 个回答

0

我觉得用条件来选择ID进行连接会更有效率,因为查询优化器有更多的选择来做出正确的决策。可以使用解释计划来查看PostgreSQL会如何处理这个问题。

1

我觉得使用视图可能会很有用。你只需要用你的查询创建一个视图,专门用来获取ID,然后通过ID来连接这个视图。这样可以把结果限制在你需要的ID范围内,而不需要使用比较耗费资源的IN语句。

我知道,IN语句的开销比EXISTS语句要大。

6

我以前用过一种方法,就是把ID放到一个临时表里,然后用这个临时表来执行一系列的查询。大概是这样的:

BEGIN;
CREATE TEMP TABLE search_result ON COMMIT DROP AS
  SELECT entity_id
  FROM entity /* long complicated search joins and conditions ... */;
-- Fetch primary entities
SELECT entity_id, entity.x /*, ... */
FROM entity JOIN search_result USING (entity_id);
-- Fetch some related entities
SELECT entity_id, related_entity_id, related_entity.x /*, ... */
FROM related_entity JOIN search_result USING (entity_id);
-- And more, as required
END;

这种方法特别适合那些搜索结果中有多个一对多关系的情况,这样你就可以在不需要做很多次选择(也就是N*M+1次选择)或者不需要把相关的实体进行笛卡尔积连接的情况下,获取你想要的数据。

撰写回答