从数据库中随机选择行子集的 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;

复杂性


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 次,其中 Nidtf_idf[= 的基数函数51=]

比如假设只有1个idL是2,如果idtf_idf的基数是1:1——在 id 上有或没有索引——系统将必须读取 MY_TABLE 中的所有行。如果每个 id 都是唯一的,但它们都映射到相同的 tf_idf,与线性扫描相比,索引可能只会增加成本。如果基数是 1:1 并且 id 是唯一的,那么 N ~ L:随着不同对的数量增加,随机选择重复的概率下降。