2014-02-09 169 views
1

我對DBMS中的索引有個疑問。我知道他們通過更快地定位數據來提高性能。但我的問題是,我想用於某個數據庫的索引類型?數據庫索引?

這裏是我從一個模擬考試有一個問題:

下列問題的基礎上查詢顯示的ER模型。

的SaleCo ER模型

SELECT   P_CODE, P_DESCRIPT, P_PRICE, PRODUCT.V_CODE, V_STATE 
FROM PRODUCT P, VENDOR V 
WHERE   P.V_CODE = V.V_CODE 
    AND   V_STATE = ‘NY’ 
    AND   V_AREACODE = ‘212’; 
ORDER BY P_PRICE; 

- 什麼指標,我會建議此查詢?爲什麼?

- 如何編寫創建我建議的索引所需的命令。

- 如何編寫用於爲PRODUCT和VENDOR表生成統計信息的命令。

應該有一個模型顯示,但沒有作爲一個示例考試,告訴你什麼期望!

如果有人能夠通過查看代碼以及如何創建它來幫助理解推薦索引的標準,我將非常感激。如果我發佈的問題(代碼)不清楚,請舉另一個例子。

非常感謝你提前

+1

索引的經驗法則:任何用於比較操作的字段都應該被索引。那就是'where','join','order by'等等所使用的任何字段......但總的來說,你的問題太廣泛了。「如何編寫命令」取決於你 - 如果這個測試是使用sql語法的話,如果我們只給你答案,你就什麼都不會了解。提示:查找「改變」。 –

回答

0

首先,我要使用標準的join語法和表別名(去除歧義其中列來自)重寫查詢:

SELECT P.P_CODE, P.P_DESCRIPT, P.P_PRICE, P.V_CODE, V.V_STATE 
FROM PRODUCT P join 
    VENDOR V 
    on P.V_CODE = V.V_CODE 
WHERE V.V_STATE = ‘NY’ AND V.V_AREACODE = ‘212’; 
ORDER BY P.P_PRICE; 

這查詢可能以兩種方式之一執行。 (1)引擎可能會掃描產品表並在供應商表中進行匹配以解決查詢(然後應用過濾器和排序)。或者,(2)它可能掃描供應商表格,查找product表格(然後應用過濾器和排序)。還有其他選擇,但這些可能。

對於(1),最佳索引是:vendor(v_code, v_state, v_areacode)product(p_price, v_code, p_code, p_descript)。這些索引中的每一個都「覆蓋」了相應的表格,這意味着索引將用於查詢,而無需在原始數據頁面中進行查找。通過在product索引中首先包含p_price,索引將按排序順序進行掃描,然後查找將在供應商表中進行,以獲取select的字段並應用篩選。最後的排序是不必要的,因爲product表已經以正確的順序被掃描。對於(2),最佳索引是vendor(v_state, v_areacode, v_code)product(v_code, p_code, p_descxript, p_price)。對於(2),最佳索引是vendor(v_state, v_areacode, v_code)product(v_code, p_code, p_descxript, p_price)。將掃描vendor索引,直接應用where子句中的過濾。然後相應的記錄將在product中查找並將最終結果排序。

哪種策略實際上更好取決於條款where條款的選擇性以及需要排序的數據大小。如果所有四個索引都可用,那麼優化引擎(在大多數數據庫中)將使用統計數據來計算出結果。