2016-09-20 53 views
0

逗人, 我運行相同的查詢和不同的值需要不同的執行時間,如下所示: 查詢是:不同的執行時間,其中在where子句

select * from table1 where userID = 2 

它掃描非羣集索引idx1,其中包含userID作爲其中一個鍵,所以我在5秒內得到結果。 但是當我用userID = 5 再次運行它時,它會掃描非包含用戶ID作爲其鍵之一的非集羣索引idx2,並在2小時後得到結果,我認爲它可能讀取整個表以找到userID = 5

這個問題的原因是什麼? 也許userID = 5的值不在idx1葉中? 我認爲在NC索引存儲的葉級的值的範圍和對用戶ID = 4以及用於用戶ID運行良好的查詢= 6,從而用戶ID = 5應該是在葉級,

請指點

+0

嘗試更新表 –

+0

的'統計量'請發表實際執行計劃和表 – TheGameiswar

+0

的架構如果用戶ID是外鍵,您應該有一個專用索引,並且不應該發生這些問題 – MtwStark

回答

0

首先更新該表的索引統計信息。 如果它不起作用並且您正在使用ASE15或+,則應更新列userID的統計信息。與ASE12相比,ASE15優化器對統計更加敏感。

+0

非常感謝Dears,我試圖在真實環境中更新此表以及與之相關的所有表的索引統計信息,並解決了問題。我試着在測試環境中爲這個表更新索引統計信息,但沒有改進,然後我更新了userID的列統計信息並解決了問題。 – scass

0

嘗試使用索引提示

對於熱修復

select * from table1 with(index(idx1) where userID = 5

價:http://blog.sqlauthority.com/2009/02/08/sql-server-introduction-to-force-index-query-hints-index-hint-part2/

對於長期解決方案

您可能需要更新表的統計信息或重建索引。 您可以關注此鏈接:Script for rebuilding and reindexing the fragmented index?

+1

強制使用索引不是一個好主意,如果優化器沒有使用它..有一個原因.. – MtwStark

+0

謝謝Dears,我不喜歡使用索引提示,因爲提到的查詢是部分報告生成應用程序在我公司,我們不能編輯代碼。 – scass