我想抓取Oracle數據庫中給定索引列值的特定行。我選擇索引列,然後選擇整行數據以便於處理。桌子上大約有一億五千萬行,我選擇大約一萬到二十萬。我使用NVL()來替換IN子句中的空值,因爲我在JAVA中動態創建這些語句。 IN子句被分塊爲由OR拼湊在一起的1000個索引塊,以避免「列表中最大表達式數量爲1000」的錯誤。優化對巨大表格的選擇查詢?
正如你所想,這個查詢需要很長時間才能運行。有什麼我可以做的,以優化這個查詢,但保持相同的功能? (無視指標值,因爲它們只是一個例子)
select INDEX_COLUMN_A, INDEX_COLUMN_B, INDEX_COLUMN_C, TABLE.* from TABLE
Where (NVL(INDEX_COLUMN_A,''), NVL(INDEX_COLUMN_B,''), NVL(INDEX_COLUMN_C,''))
IN (('1','1','1'), ('2','2','2'), ... ('1000','1000','1000'))
OR (NVL(INDEX_COLUMN_A,''), NVL(INDEX_COLUMN_B,''), NVL(INDEX_COLUMN_C,''))
IN (('1001','1001','1001'), ('1002','1002','1002'), ... ('2000','2000','2000'))
OR...
在像NVL這樣的函數調用中包裝索引列有效地防止Oracle使用索引。您可以創建一個基於函數的索引或者消除「NVL」調用。 –
如果您選擇表格的1/1000行,索引可能甚至不會有用;無論如何,全表掃描可能會更快。 –
@MickMnemonic啊我沒有意識到NVL會毀了索引。這是最不幸的。謝謝(你的)信息。 – JoshKni8