从数据库中随机选择行子集的 SQL 查询的复杂性是多少?
What is the complexity of an SQL query that randomly selects a subset of rows from a database?
简介
我在 SQLITE3 数据库上使用以下 SQL 查询。我想 randomly select N 具有 id greater or equal
的行随机生成的数字在[1,...,max(id)]
之间。 table 包含 4000 万行。因此 max(id) = 40M
.
SQL查询
SELECT distinct tf_idf
FROM MY_TABLE
WHERE id >= (abs(random()) % (SELECT max(id) FROM MY_TABLE))
LIMIT L;
复杂性
- random() 的复杂度为
O(1)
。
(SELECT max(id) FROM MY_TABLE)
的复杂度是 O(N)
。
- 我仍然无法计算
distinct tf_idf
的复杂度
SQL 不提供复杂性保证。我们能做的最好的事情就是谈论理论上可能的下限,并记住其他因素可能占主导地位。
the complexity of (SELECT max(id) FROM MY_TABLE) is O(N).
或 O(log N),取决于你的索引,以及它是否被使用。或者可能是 O(1),如果 max(id)
被特殊对待。
distinct
的复杂性同样是不透明的。它意味着一种排序,我们可以将其视为 O(n log n)。但如果数据已经排序,它只是 O(N) ,如果已知它们不包含重复项,则更便宜。
查看您的查询,我会这样处理您的问题:
- 沿
id
上的索引进行二进制搜索,如果存在
- 沿索引(假定)进行二进制搜索以获取输出
tf_idf
- N 次,其中 N 是
id
和 tf_idf
[= 的基数函数51=]
比如假设只有1个id
,L
是2,如果id
到tf_idf
的基数是1:1——在 id
上有或没有索引——系统将必须读取 MY_TABLE
中的所有行。如果每个 id
都是唯一的,但它们都映射到相同的 tf_idf
,与线性扫描相比,索引可能只会增加成本。如果基数是 1:1 并且 id
是唯一的,那么 N ~ L:随着不同对的数量增加,随机选择重复的概率下降。
简介
我在 SQLITE3 数据库上使用以下 SQL 查询。我想 randomly select N 具有 id greater or equal
的行随机生成的数字在[1,...,max(id)]
之间。 table 包含 4000 万行。因此 max(id) = 40M
.
SQL查询
SELECT distinct tf_idf
FROM MY_TABLE
WHERE id >= (abs(random()) % (SELECT max(id) FROM MY_TABLE))
LIMIT L;
复杂性
- random() 的复杂度为
O(1)
。 (SELECT max(id) FROM MY_TABLE)
的复杂度是O(N)
。- 我仍然无法计算
distinct tf_idf
的复杂度
SQL 不提供复杂性保证。我们能做的最好的事情就是谈论理论上可能的下限,并记住其他因素可能占主导地位。
the complexity of (SELECT max(id) FROM MY_TABLE) is O(N).
或 O(log N),取决于你的索引,以及它是否被使用。或者可能是 O(1),如果 max(id)
被特殊对待。
distinct
的复杂性同样是不透明的。它意味着一种排序,我们可以将其视为 O(n log n)。但如果数据已经排序,它只是 O(N) ,如果已知它们不包含重复项,则更便宜。
查看您的查询,我会这样处理您的问题:
- 沿
id
上的索引进行二进制搜索,如果存在 - 沿索引(假定)进行二进制搜索以获取输出
tf_idf
- N 次,其中 N 是
id
和tf_idf
[= 的基数函数51=]
比如假设只有1个id
,L
是2,如果id
到tf_idf
的基数是1:1——在 id
上有或没有索引——系统将必须读取 MY_TABLE
中的所有行。如果每个 id
都是唯一的,但它们都映射到相同的 tf_idf
,与线性扫描相比,索引可能只会增加成本。如果基数是 1:1 并且 id
是唯一的,那么 N ~ L:随着不同对的数量增加,随机选择重复的概率下降。