1

我知道這個問題已經在這裏被問過不止一次。但我無法解決我的問題,因此再次發佈求助。DB索引不被調用

我有一個表,稱爲交易在Oracle數據庫(11克)與270萬條記錄。有一個包含數值的非空varchar2(20)txn_id)列。這不是表格的主鍵,並且大部分值都是唯一的。我的意思是大部分數值都可以在表格中出現3-4次。

如果我根據TXN_ID執行select的簡單查詢,則需要大約5秒或更長時間來返回結果。

Select * from Transaction t where t.txn_id = 245643 

我有這個列上創建的索引,但是當我檢查上述查詢的解釋計劃時,它使用全表掃描。此查詢在應用程序中多次使用,導致應用程序變慢。

你能提供一些幫助,可能會導致此問題嗎?

+3

發佈查詢計劃(包括訪問和過濾器謂詞)將會很有幫助。如果該列是'varchar2',那麼爲什麼要將它與一個數字而不是一個字符串進行比較?如果你的謂詞是't.txn_id ='245643''會發生什麼呢?你的應用程序是否真的使用了文字(我確定不希望)?如果它使用綁定變量,它綁定的是數值還是字符串值? –

+2

你可以發佈索引定義嗎? txn_id是索引中唯一的列嗎? –

回答

3

您正在比較varchar列與數字文字(245643)。這迫使甲骨文轉換平等的一方,而且,這似乎是選擇了「錯誤」的一面。而不必猜測Oracle如何處理此轉換,請使用字符文字:

SELECT * FROM Transaction t WHERE t.txn_id = '245643' 
+0

我明白你的觀點。我測試了它,並且在比較兩側的varchar時使用了索引。我將檢查爲什麼應用程序調用需要這麼長時間。可能是類似的問題。謝謝。我接受你的回答:) – mehta