1

首先:我不是一個DB專家,所以請盡情享受,如果問題很瑣碎...火鳥2.5 SQL查詢執行計劃不使用索引或聲明

我有一個子表CHILD查詢尋找在主表PARENT中增加一些值以確定是否要加載條目。

查詢看起來像這樣

SELECT C.*, P.DATE, P.STATUS 
FROM CHILD C, PARENT P 
WHERE C.PARENT_ID = P.ID 
AND (P.DATE > '01.01.2015' OR (P.STATUS <> 1 AND P.STATUS <> 9)); 

我選擇的目的STATUS價值觀強調的是,我需要使用的不平等,我需要選擇從是不連續的狀態值。

我對PARENT.ID有外鍵CHILD.PARENT_ID,並創建了一個索引CHILD.PARENT_ID。我還在和STATUS字段的表PARENT上創建了索引。

現在,當我更換OR與和ANDCHILD使用上PARENT_IDPARENT索引使用上DATE, STATUS這是我所期望的指數。

但是,當使用OR時,查詢使用CHILD上的自然計劃和PARENT.ID上的主鍵索引。

發生同樣,如果我申請查詢僅父表:

SELECT P.* FROM PARENT P WHERE (P.DATE > '01.01.2015' OR (P.STATUS <> 1 AND P.STATUS <> 9)); 

有沒有辦法來優化這樣的查詢使用比天然計劃好?

+0

你能否在這裏更新兩個計劃:http://www.brentozar.com/pastetheplan/ ..此外,表格數量, – TheGameiswar

+0

這兩個表上的索引請標記您正在使用的數據庫。 –

+0

請編輯您的問題,爲所討論的表(包括所有索引)和執行計劃添加'create table'語句。 [_Formatted_](http://stackoverflow.com/help/formatting)**文本**請[無屏幕截圖](http://meta.stackoverflow.com/questions/285551/why-may-i-not -upload圖像-的代碼上那麼當-要價-A-問題/ 285557#285557) –

回答

2

如果你寫'或',每個P.DATE可能是一個命中。每個P.STATUS也可能是一個命中。如果你想使用索引,這不是很好的先決條件。

在這裏,你必須幫助你的系統,並提出兩個單獨的問題,並將它們與UNION連接起來。 Like

SELECT C.*, P.DATE, P.STATUS 
    FROM CHILD C, PARENT P 
WHERE C.PARENT_ID = P.ID 
    AND P.DATE > '01.01.2015' 
UNION 
SELECT C.*, P.DATE, P.STATUS 
    FROM CHILD C, PARENT P 
WHERE C.PARENT_ID = P.ID 
    AND P.STATUS <> 1 
    AND P.STATUS <> 9; 

注意:如果P.STATUS的大多數值不等於1且不等於9,那麼您的性能仍然不佳。試想一下,你正在查找一本書,所有單詞都被編入索引中,並用於「和」這個詞。它將在每一頁;按順序讀書會比使用索引更快。

2

這對於優化器在其上使用索引可能相當困難。首先,使用join來重寫查詢:

SELECT C.*, P.DATE, P.STATUS 
FROM CHILD C JOIN 
    PARENT P 
    ON C.PARENT_ID = P.ID 
WHERE P.DATE > '2015-01-01' OR P.STATUS NOT IN (1, 9); 

你可以重寫這個使用UNION ALL

SELECT C.*, P.DATE, P.STATUS 
FROM CHILD C JOIN 
    PARENT P 
    ON C.PARENT_ID = P.ID 
WHERE P.DATE > '2015-01-01' 
UNION ALL 
SELECT C.*, P.DATE, P.STATUS 
FROM CHILD C JOIN 
    PARENT P 
    ON C.PARENT_ID = P.ID 
WHERE P.DATE <= '2015-01-01' AND -- This condition prevents overlaps 
     P.STATUS NOT IN (1, 9); 

子查詢現在可以利用索引對PARENT(DATE, ID)PARENT(STATUS, DATE, ID)

但是,過濾結果實際上會使查詢更快,這並不明確。這取決於過濾器的選擇性。