[英]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.