我在SQLITE3数据库上使用以下SQL查询。我想随机选择 N 行 id greater or equal
到随机生成的数字[1,...,max(id)]
。该表包含40万行。因此max(id) = 40M
。
SELECT distinct tf_idf
FROM MY_TABLE
WHERE id >= (abs(random()) % (SELECT max(id) FROM MY_TABLE))
LIMIT L;
O(1)
。(SELECT max(id) FROM MY_TABLE)
的复杂性为O(N)
。distinct tf_idf
答案 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
id
和tf_idf
例如,假设只有1 id
且L
为2.如果id
到tf_idf
的基数为1:1 - 有或没有id
上的索引 - 系统必须读取MY_TABLE
中的所有行。如果每个id
都是唯一的,但它们都映射到相同的tf_idf
,那么索引可能只会增加成本而不是线性扫描。如果基数为1:1且id
是唯一的,那么 N~L :随着不同对的数量增加,随机选择重复的概率会下降。