輔助複合鍵頁面訪問
我們有這個關係
商店:[ SID , City, EID]
員工: [ EID , Name, Salary, SID]
文章: [ AID , Name, Producer, Price]
庫存: [ AID , SID , Count]
發票: [ IID , SID , 客戶]
項目: [ IID , SID , AID , 計數]
Store.EID 是引用 Employee.EID 的外鍵並指定商店經理。Employee.SID 是引用 Store.SID 的外鍵,並描述了該員工在哪個商店中受僱。庫存表儲存(使用外鍵)在哪個商店(SID)有多少物品(AID)。發票在商店 (SID) 生成,由多個項目組成,其中每個項目由一個物品 (AID) 和一個計數組成。
Employee 表包含 20 000 名員工,其中正好兩個元組放入一頁。每個員工的工資(均勻分配)在 20 000 到 100 000 之間。有 10 家商店,每家商店的員工數量相同。Employee 表在 (Salary,EID) 和 (EID,Salary) 上有兩個輔助複合鍵索引。兩個索引都是高度為 h 的 B+ 樹,每個葉子可以儲存 5 個對頁面的引用。
問題是對於查詢 select * from Employee where EID = 5 and Salary > 60000,哪個索引需要更少的頁面訪問?
所以我知道在這裡使用 (EID, Salary) 更好,因為 EID 是唯一的,它會轉到 EID = 5 然後找到他的薪水,但是,我覺得有點混亂,因為實際上,我們有一次訪問 EID 5 然後將檢查條件,我們將獲得該員工或不獲得該員工。那麼如何計算每個成本以便在它們之間進行比較呢?
由於索引 (EID,Salary) 的高度為 h,因此 EID 上的 PK 必須具有高度 <=h。如果這是一個聚集索引,那麼對於 <= h LIO(頁面讀取),PK 可以滿足查詢。
然後假設 PK 沒有集群,使用 PK 成本 h 或 h + 1 LIO。
將檢查條件,我們將獲得該員工或不獲得該員工。那麼如何計算每個成本以便在它們之間進行比較呢?
工資 >60000 的機率大約是 0.5,因此可以計算出預期成本。在 (EID,Salary) 上使用索引的預期成本為
0.5 * h + 0.5 * (h+1) = h + 0.5 LIO。
使用 (Salary,EID) 索引需要 h LIO 來查找 Salary > 60000 的第一行,然後您可以掃描葉子頁面以找到 EID=5,這將需要讀取總數的 (0 -.05]葉頁。如果員工每頁有 2 行,則 (Salary, EID) 索引可能每頁有 8 行。因此,您平均掃描 0.25 行或 (20,000/8)/4=625。因此,這將平均花費 625 小時以上的 LIO。