从数据库中随机选择行子集的SQL查询的复杂性是多少?

时间:2016-07-06 13:17:20

标签: sql big-o

简介

我在SQLITE3数据库上使用以下SQL查询。我想随机选择 N id greater or equal随机生成的数字[1,...,max(id)]。该表包含40万行。因此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
  • 的复杂程度

1 个答案:

答案 0 :(得分:2)

SQL不提供复杂性保证。我们能做的最好的事情是谈论理论上可行的下限,并记住其他因素可能占主导地位。

  

(SELECT max(id)FROM MY_TABLE)的复杂性是O(N)。

或O(log N ),具体取决于您的索引,以及是否使用它。或者可能是O(1),如果max(id)被特别处理。

distinct的复杂性同样不透明。它意味着一种排序,我们可以将其视为O( n log n )。但是,如果数据已经排序,则只有O( N ),如果已知它们不包含重复数据,则更便宜。

查看您的查询,我会以这种方式处理您的问题:

  • 沿着id上的索引进行二进制搜索(如果存在的话)
  • 沿输出tf_idf
  • 的索引(推定)进行二进制搜索
  • N 次,其中 N idtf_idf
  • 的基数的函数

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