首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >此sql查询的搜索时间复杂性

此sql查询的搜索时间复杂性
EN

Stack Overflow用户
提问于 2014-12-30 23:26:47
回答 2查看 2.3K关注 0票数 1

本表提供了有关房地产的信息。列“类型”包含“公寓”、“房屋”、“乡镇住宅”或“别墅”的值。每种类型的条目数大约占表中条目总数的25%。

表名、列名、数据类型、RealEstate ID、DEC(10)类型、VARCHAR(40)、Price DEC(10、2)大小DEC(4)典型的查询要求所有给定类型的不动产:从RealEstate中选择ID,其中为该表定义了Type =‘House’两个索引。第一个索引是为“ID”列定义的,第二个索引是为“类型”列定义的。相对于条目数n和结果集m的大小,这个查询的时间复杂度是多少?

时间复杂度为O (log(n)+m)或O(n)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-30 23:38:31

这是非常粗略的说法,在某种程度上是一种推测:

复杂性应该是O(m),因为由于存在索引,

DB引擎可以找到/找到匹配Type = 'House'的记录。

在固定的时间内。所以这里所花费的时间就是处理

匹配计数为m的记录(例如读取它们并返回)

打电话的人)。因此,复杂度是O(m),因为处理

与返回的记录的数量成正比。

但如果从较低的角度来看,我想这也取决于许多其他因素:

如果您的索引维护良好(不是分段的),则如果记录位置良好。

在磁盘上(例如顺序)等,所以很难给出一个直接的/简单的

大O公式。

票数 2
EN

Stack Overflow用户

发布于 2015-01-07 06:46:49

时间复杂度可能是O(n)。

这个问题是另一种提问方式:“这个查询是使用索引扫描还是全表扫描?”通常,索引范围扫描在查找一小部分行时工作得更好。而且,一般来说,当查找大量行时,全表扫描工作得更好。

没有一个“神奇数字”。但根据我的经验,对于任何一个显着大小的表格,25%肯定是在完整的表格扫描区域。

这个决定取决于许多因素:缓存、多块读取计数、物理存储、统计(对象和系统)、群集因素(行存储在磁盘上的情况如何--因为Oracle每次检索一个块可能需要读取100%的块才能读取1%的数据),等等。

码样例

下面是一个简单的示例演示,一个完整的表扫描。注意,我使用的是100000行。如果问题是关于一个只有少数行的表,那么复杂性就无关紧要了,因为常数开销将比算法更重要。

代码语言:javascript
复制
create table RealEstate
(
    ID       DEC(10),
    Type     VARCHAR(40),
    Price    DEC(10,2),
    the_Size DEC(4)
);
create index RealEstate_idx on RealEstate(type);

insert into RealEstate
select level, decode(mod(level, 4), 0, 'Apartment', 1, 'House', 2, 'Townhouse', 3, 'Villa') , 100, 100
from dual connect by level <= 100000;
begin
    dbms_stats.gather_table_stats(user, 'realestate');
end;
/

执行计划

注意TABLE ACCESS FULL

代码语言:javascript
复制
explain plan for select * from RealEstate where type = 'House';
select * from table(dbms_xplan.display);


Plan hash value: 4238863598

--------------------------------------------------------------------------------
| Id  | Operation         | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |            | 25000 |   463K|   103   (1)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| REALESTATE | 25000 |   463K|   103   (1)| 00:00:01 |
--------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("TYPE"='House')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27714068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档