【问题标题】:what is the minimum time Order of a query in SQL databases?SQL 数据库中查询的最小时间顺序是多少?
【发布时间】:2017-11-30 03:14:25
【问题描述】:

我想知道给定SQL(特别是SQLite)数据库(有n条记录)中的最短查询时间是多少。 我知道full table scanO(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


【解决方案1】:

查找特定行需要进行搜索。 (并非每个 rowid 都必须存在,因此数据库需要查看。)乐观情况,甚至是平均情况,应该比 log(n) 快得多,但最坏的情况不能,因为它需要搜索列表。

【讨论】:

  • 让我们假设所有 rowid 都存在(1 到 n)并且我们想要第 m 行,所以我们确切地知道它在哪里,所以不需要搜索只得到它!
  • 不,它不能。计算机需要索引项目的位置以便查找它们 - 这不是“将 M 添加到项目 1 的位置”。
【解决方案2】:

如果要从索引列 (SELECT MIN(x) FROM table)、数据库can simply read the first or last value 中检索最小值或最大值,并且时间为 O(1)。

索引存储为 B 树,索引列作为键。
表存储为 B 树,以 rowid 作为键,因此搜索 rowid 与在索引中搜索值一样快。

【讨论】:

  • 正如 Pham X. Bach 所说(如果正确!)在 Oracle 中通过 rowid 访问,MySql ..(不是 SQLite)也是 O(1)
猜你喜欢
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 2013-04-26
  • 2015-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多