WHERE NOT IN 语句的大 O 是什么?
What is the Big-O for WHERE NOT IN statement?
我有一个简单的 sql 查询,仅当 some_table 中的 id 不在其他一些 id 结果集中时,我才从 some_table 中选择行。
例如:
SELECT * FROM some_table
WHERE some_table.id NOT IN
(SELECT id FROM
.... whatever statement might be related to this table
)
如果那个子语句returns结果集如
id
----
160142
160120
160093
160092
NOT IN 是一个 O(N) 吗,给定一个 "some_table.id",它从结果集的顶部开始并线性扫描每条记录,直到找到具有相同值的记录?或者它是否使用散列(如 Java 中的 HashSet)并能够在 O(1) 中找到它?
这是否因 SQL 实施而异?例如,在我的应用程序中,我们使用 PostgreSQL。但如果它在 Oracle 或 MS SQL Server 中可能有所不同,我不会感到惊讶。
我希望这是一个持续的操作。但我不知道,只是好奇。
如果n是some_table的大小,m是子结果的最大大小,那么针对 m 中的每个元素检查 n 中的每个元素的朴素算法是 O(mn).
实际上,正如 jpmc26 提到的,底层实现将决定这一点。例如,如果 m 中的 id 被索引,则可以在 O(lg m) 时间内访问它,因此可以检查 n m 在 O(nlg m) 时间内。由于您必须至少检查 n 的每个元素,因此任何实现都将在 Ω(n) 处下限。
我有一个简单的 sql 查询,仅当 some_table 中的 id 不在其他一些 id 结果集中时,我才从 some_table 中选择行。
例如:
SELECT * FROM some_table
WHERE some_table.id NOT IN
(SELECT id FROM
.... whatever statement might be related to this table
)
如果那个子语句returns结果集如
id
----
160142
160120
160093
160092
NOT IN 是一个 O(N) 吗,给定一个 "some_table.id",它从结果集的顶部开始并线性扫描每条记录,直到找到具有相同值的记录?或者它是否使用散列(如 Java 中的 HashSet)并能够在 O(1) 中找到它?
这是否因 SQL 实施而异?例如,在我的应用程序中,我们使用 PostgreSQL。但如果它在 Oracle 或 MS SQL Server 中可能有所不同,我不会感到惊讶。
我希望这是一个持续的操作。但我不知道,只是好奇。
如果n是some_table的大小,m是子结果的最大大小,那么针对 m 中的每个元素检查 n 中的每个元素的朴素算法是 O(mn).
实际上,正如 jpmc26 提到的,底层实现将决定这一点。例如,如果 m 中的 id 被索引,则可以在 O(lg m) 时间内访问它,因此可以检查 n m 在 O(nlg m) 时间内。由于您必须至少检查 n 的每个元素,因此任何实现都将在 Ω(n) 处下限。