簡體   English   中英

從Oracle的Progress數據服務器中停止與索引相關的提示和子句

[英]Stopping index related hints and clauses from Progress data server for oracle

我正在為Oracle使用進度數據服務器。 實際的數據庫駐留在ORACLE 11g上,並且僅使用oracle DB模式創建進度模式,並使用ora-brokers連接Oracle DB。 我們希望Oracle根據執行計划來處理索引選擇,因此我們為Data Server添加了-noindexhint參數,它停止了查詢的索引提示,而這些查詢是Oracle遇到的。 現在的問題是,即使沒有索引提示,數據服務器也會使用與where子句列及其順序匹配的索引向SQL查詢添加order by子句(即使在進度查詢中未使用by子句)。 由於來自數據服務器的此順序,Oracle被迫使用其他索引,這會花費很多時間。 這里的一種解決方案似乎是從Schema持有者中刪除所有索引,因為在源代碼中我們沒有使用任何顯式的use-index關鍵字。 請提供您的意見以處理這種情況。

您不應阻止全局阻止訂單的嘗試,而且我很確定您不能通過開關來執行此操作。

之所以要添加order by,是因為Progress試圖維持與代碼針對Progress DB運行相同的行為。 意思是,如果您使用的是FIND FIRST(例如),則有一個特定的含義是FIRST記錄,而不僅僅是隨機記錄(除非您指定order by,否則Oracle一樣)。

通常,但並非總是如此,當我遇到這些問題時,我發現列的統計信息不夠詳細,無法知道有多少記錄要返回,並且/或者沒有正確設置與排序/ IO相關的參數。 這會導致CBO做出錯誤的決定並選擇索引路徑,而不是對通常返回的較小子集進行排序。

我將首先檢查這些內容,並確保您具有適當數量的直方圖或切換到SKEW,然后再開始與模式持有人混淆。

從模式持有者中刪除索引將是有問題的,因為這將影響Progress如何看待表與表的唯一性之間的關系。

您的確有一些與代碼相關的選項:

  1. 運行存儲過程,而不使用FOR / FIND。
  2. 通過SQL運行傳遞而不是使用FOR / FIND。
  3. 在Oracle端添加與指定排序匹配的索引

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM