簡體   English   中英

此SQL查詢的搜索時間復雜度

[英]Search time complexity of this sql query

下表提供有關房地產的信息。 “類型”列包含值“公寓”,“房屋”,“聯排別墅”或“別墅”。 每種類型的條目數大約是表中條目總數的25%。

表名稱列名稱數據類型RealEstate ID DEC(10)類型VARCHAR(40)價格DEC(10,2)大小DEC(4)典型的查詢會詢問給定類型的所有房地產:從RealEstate中選擇ID,其中Type =′為該表定義了房屋的兩個索引。 為列“ ID”定義了第一個索引,為列“ Type”定義了第二個索引。 相對於條目數n和結果集m的大小,此查詢的時間復雜度是多少?

時間復雜度將是O(log(n)+ m)或O(n)?

粗略地說,這在某種程度上是一種推測:

復雜度應為O(m),因為由於存在索引,
DB引擎可以查找/定位與Type = 'House'相匹配的記錄
在恆定的時間內。 因此,這里需要花費的時間就是處理
匹配記錄的計數為m(例如讀取它們並返回
他們給呼叫者)。 因此復雜度為O(m),因為處理
與返回的記錄數成正比。

但是從較低的角度來看,我想這也取決於許多其他因素:
如果您的索引維護良好(不零散),如果記錄位置合理
在磁盤上(例如順序)等,因此很難給出直接/簡單的信息
大O公式。

時間復雜度可能為O(n)。

這個問題是另一種詢問“此查詢將使用索引掃描還是全表掃描?”的方式。 通常,當查找一小部分行時,索引范圍掃描會更好地工作。 而且,通常,當查找很大一部分行時,全表掃描效果更好。

沒有一個“魔術數字”。 但是根據我的經驗,對於任何大小的表,絕對有25%處於整個表掃描區域。

該決定取決於許多因素:緩存,多塊讀取計數,物理存儲,統計信息(對象和系統),集群因素(磁盤上的行存儲狀況如何-因為Oracle一次查詢可能一次檢索一個塊的數據)需要讀取100%的塊以讀取1%的數據),等等。

代碼樣例

這是一個簡單的示例,演示了全表掃描。 請注意,我正在使用100000行。 如果問題是關於只有幾行的表,那么時間復雜度就無關緊要了,因為恆定的開銷比算法要重要得多。

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

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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM