2010-09-14 99 views
0

我們有一個包含兩個非聚簇索引的表。兩個索引都具有相同的三列,按照相同的順序,它們只有不同之處在於一列按升序排列。開發人員創建了一個存儲過程,在他打算(但忘記!)的地方執行選擇,強制使用索引而不是執行Order by。當一個用戶運行查詢時,一個索引被一致地選擇(具有諷刺意味的是一段時間內掩蓋了這個錯誤的正確的索引),當另一個用戶運行該過程時,返回另一個索引。兩個用戶運行完全相同的程序會影響索引選擇會有什麼不同?Sybase非聚簇索引選擇

(注意:這段代碼將被重寫,但我正試圖對這裏發佈的After Action Report進行補充)。

由於提前

回答

0

索引是更復雜一點比他們似乎。數據庫系統根據查詢計劃,表格卷,行數,數據庫緩存決定使用索引(或不使用索引)。 數據庫系統根據查詢和上述數據進行成本估算(基數概率,I/O估算等)。

如果你有不同的排序方案的兩個類似的指標,有機會的話,所需的索引鍵(i)位於幾乎n/2 WHERE n=index size

還有,基於數據(重複數據的可能性/串行數據),sybase不關心索引,因此不能決定使用哪一個。

一次刪除一個索引,看看會發生什麼。

1

您尚未指定您擁有的Sybase。我會承擔ASE。

指數選擇取決於幾個因素。

鑑於你的情況下,這裏的代碼並沒有改變,而這兩個用戶都使用相同的存儲的過程,有兩種可能性:

  • 檢查,統計數據是最新的。取決於DBA如何自動執行UPDATE STATISTICS函數以及級別(索引或表級別);一個索引可能是最新的,另一個可能已過時。與ASE 12.5.4優化程序不同,ASE 15.x優化程序對統計信息很敏感。

  • 每個用戶正在使用一組不同的數據,搜索參數,變量等,它們作爲輸入提供給相同的存儲過程。 ASE在運行時根據(a)確切的輸入數據(搜索參數)與(b)指數的有用性進行索引選擇。並且所有它知道它根據最新的UPDATE STATS的統計信息。

相關問題