2017-02-20 64 views
1

我有一個表格ORDER有64列,OrderNo是主鍵。它還有兩列ParentOrderNoType。對於單獨的訂單,Type和ParentOrderNo將爲NULL,對於分組訂單,Type將填充「PRNT」或「CHLD」。 OrderNo where Type='PRNT'將填充到組的所有訂單(PRNT和CHLD)的ParentOrderNo列。一個組可以有1個父母和2個或更多的子訂單。該表具有用於列ParentOrderNoType的非聚集索引(IX_ORDER_1)。索引查找對索引掃描的變化在where子句中的值變化

此表中共有31654行。在我的測試案例中,有30001個訂單(1個父母和30000個孩子)。

當我執行查詢:

Select top 1 * 
    From ORDER     
    where PARENTORDERNO = '11278' and Type ='prnt' 

執行計劃顯示索引查找使用(IX_ORDER_1)

但是當我執行查詢:

Select top 1 * 
    From ORDER     
    where PARENTORDERNO = '11278' and Type ='chld' 

執行計劃顯示索引掃描使用聚集索引

有人可以指導我什麼導致這種變化執行計劃。 在此先感謝

回答

0

根據數據庫維護有關索引的統計信息,優化程序(正確)估計在​​時只有極少的記錄匹配條件,因此查找效率更高。對於type='child',它估計有足夠的記錄可以使掃描效率更高,因爲它將返回表格中的大部分內容,而不僅僅是一條記錄。

在執行計劃中,查看Estimated Rows(和Actual Rows,以瞭解估計的準確程度)兩次不同的運行。

+0

什麼時候掃描比搜索更有效率?如何? – user7592627

0

不幸的是我不能添加評論,所以我的回答是這樣的:

你什麼時候從表中選擇更多的是CCA 15%的行(百分比變化超過來源,但通常他們堅持10〜15%),執行計劃很可能會使用索引掃描而不是索引查找。

在你的情況,如果我理解正確的話,你有

「在我的測試情況下,有30001點的訂單(1名家長和30000名兒童)。」

只有一個父行,這是很好的候選索引查找,以及30 000個子行,這對於查詢優化器絕對是不好的候選。

+0

你的回答非常有用。我點擊了「這個答案很有用」按鈕。但是我收到了這條消息:「感謝您的反饋!記錄下名聲低於15的人的投票記錄,但不會更改公開顯示的帖子分數」。感謝幫助。 此刻我的聲望是6。 :( – user7592627

相關問題