我在這個表單中有一個查詢,平均需要約100個子句元素,並且在某些罕見時間超過1000個元素。如果超過1000個元素,我們會將in子句分塊到1000(Oracle最大值)。沒有聯接的Oracle IN子句的性能影響是什麼?
的SQL是在
SELECT * FROM tab WHERE PrimaryKeyID IN (1,2,3,4,5,...)
我從選擇的表是巨大的,將包含數百萬更多的行比什麼是我的條款的形式。我的擔憂是,優化器可能會選擇做表掃描(我們的數據庫沒有最新的統計信息 - 是的 - 我知道...)
有沒有一個提示,我可以通過強制使用主鍵 - 無需知道主鍵的索引名稱,可能類似.../* + DO_NOT_TABLE_SCAN * /?
是否有創造性的方法來拉回數據,使得
- 我們進行
- 我們,我們讀取的塊數最少的往返次數最少(在邏輯IO級別?)
- 這會不會是快..
SELECT * FROM tab WHERE PrimaryKeyID = 1 UNION SELECT * FROM tab WHERE PrimaryKeyID = 2 UNION SELECT * FROM tab WHERE PrimaryKeyID = 2 UNION ....
['+ INDEX(tab)'](http://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements006.htm#SQLRF50405)?因人而異。儘管可能只是確保適當的統計信息和信任查詢計劃者(當計劃者認爲它在IO成本方面「更好」時,通常會選擇FTS,因此強制索引使用可能會顛覆這一點)。另一種方法是通過OPTIMIZER_INDEX_COST_ADJ降低索引使用成本。再次,YMMV。 – user2864740