2014-01-24 207 views
0

當我選擇唯一的ID我沒有看到聚簇索引掃描,但是當我選擇一個XML列時,我看到聚簇索引掃描。聚集索引掃描

索引是否僅用於Where子句,但不適用於select子句?

declare @LenderID int = null, 
@LenderCode varchar(64)= null 
--Add Lender Search as in Lender Maintenance 
if @LenderID is not NULL 
    Select @LenderCode = CODE_TX from LENDER 
    where ID = @LenderID and PURGE_DT IS NULL 

declare @StartDate datetime2 = '1/22/2014 12:00:00 AM', 
     @EndDate datetime2 = '1/24/2014 12:00:00 AM' 
select rh.id 
from REPORT_HISTORY rh 
where 
(
    (@StartDate is NULL or @EndDate is NULL) 
or 
    (RH.CREATE_DT between @StartDate and @EndDate) 
) 
and 
(
    RH.LENDER_ID = @LenderID 
or 
    @LenderCode is NULL 
) 

而且令人驚訝的是一個數據庫無法處理的條款一樣@StartDate爲空或@EndDate爲NULL,去索引掃描,如果給定值爲null應該忽略的領域。提前

+0

你可以在哪裏發佈兩個* actual *執行計劃嗎? –

+0

它生成巨大的XML,我會嘗試 – Roninn

+0

你是如何定義你的聚集索引?你能發佈定義它的腳本嗎?實際執行計劃的屏幕截圖也會有所幫助。 –

回答

0

感謝答案很可能會基於什麼查詢優化器認爲你的表和index--包括,除其他事項外,行大小以及適用的統計信息。

索引不是魔術,它們並不總是幫助。如果SQL Server選擇使用索引,它應該能夠在索引中高效地查找索引中包含的任何內容。但同樣道理,如果您詢問索引未涵蓋的任何信息,則該數據將位於其他位置(磁盤或內存中),並且需要使用聚簇索引進行交叉引用。

因此,當提出查詢時,SQL Server需要做出假設並猜測最佳查詢計劃。索引查詢會返回多少行?如果該過程需要讀取多少數據,而不是讀取聚集索引時要讀取的預期數量?需要多少次執行聚集索引才能獲取更多數據?

所以,要檢查的事情:您的索引是否覆蓋了XML列?如果不是,您的查詢將返回多少行與主表中的行數?你的統計資料是否最新?如果你真的想要,你可以使用查詢提示來強制使用一個特定的索引,但你應該首先查看這些其他的東西。

相關問題