【发布时间】:2017-11-30 03:14:25
【问题描述】:
我想知道给定SQL(特别是SQLite)数据库(有n条记录)中的最短查询时间是多少。
我知道full table scan 是O(n),对于索引列(和RowId)它是O(log(n))。
第一个问题:有没有时间小于O(log(n))的情况?
第二个问题:为什么查询RowId (SELECT *FROM table_01 WHERE rowid='234') 也是 O(log(n))?如果它 (RowId) 从 1 到 n 排序,我逻辑上预计 SQL 可以立即找到具有给定 RowId 的行
【问题讨论】:
-
第二个问题,请回答这个简单的问题:你有一本书有 2000 页。现在您想转到第 1077 页。您如何立即找到该页面?再上一层,如果页面不是1、2、3、...而是1、3、15、17(丢失了很多页)?
-
电脑不是人!它可以跳转到该位置!
-
当计算机想要读取内存地址例如 0xt543s4ff32 时它不会搜索它!!!
-
对不起,我错了。
rowid is address of the row所以对于您在第二个问题中的查询,数据库应该立即找到该行。你从哪个来源得到它是 O(log(n))?您应该检查查询计划以确认这一点。 -
这是 oracle
1 - TABLE ACCESS BY USER ROWID - access(CHARTOROWID('2392'))0 - SELECT STATEMENT的查询计划。无需扫描,立即访问。我希望SQLite有相同或相似的计划。
标签: sql algorithm sqlite database-optimization