如果您在sql developer中用靜態變量替換綁定變量,那麼您並不真正運行相同的測試。確保你使用綁定變量,並且如果速度太慢,你只是由於一個糟糕的緩存執行計劃而陷入困境。更新該表上的統計數據應該解決它。
但是,如果您實際上在SQL開發人員中使用綁定變量,請繼續閱讀。 TLDR版本是ODP.net運行的參數有時會導致稍微更悲觀的方法。從更新統計開始,但讓你的dba在兩種情況下捕捉執行計劃並進行比較以確認。
我從這裏重新發布我的回答:https://stackoverflow.com/a/14712992/852208 我認爲你標記爲重複的,但你的標題是有點更簡潔,因爲它識別查詢並在SQL Developer中跑得快。我會以另一種方式歡迎處理意見。
將以下內容添加到您的配置將發送odp。網絡追蹤信息記錄到日誌文件:
這可能只會是有益的,如果你能及時發現有很大的差距。實際上,行正在進入,只是速度較慢。
嘗試在連接字符串中添加「enlist = false」。我不認爲這是一個解決方案,因爲它會有效地禁用分佈式事務,但它應該可以幫助您隔離問題。您可以從Oracle forumns後得到一點點信息:
從ODP角度來看,所有我們真的可以指出的是,當OCI_ATR_EXTERNAL_NAME和OCI_ATR_INTERNAL_NAME 是底層的OCI連接上設置發生 行爲(當 distrib tx support啓用時會發生什麼情況)。
我猜你沒有看到的是,該執行計劃實際上是不同的odp.net調用和SQL Developer的通話之間(指實際的性能損失實際上是存在的服務器上)。讓dba跟蹤連接,並從odp.net調用和直接從SQL Developer調用(或使用enlist = false參數)獲取執行計劃。
如果您確認不同的執行計劃或者您想在黑暗中搶先拍攝,請更新相關表格的統計數據。在我的情況下,這糾正了這個問題,表明執行計劃生成並不真正遵循不同類型連接的不同規則,但是在涉及分佈式事務時,成本分析只是略微更加輕鬆。查詢提示以強制執行計劃也是一種選擇,但僅作爲最後的手段。
最後,它可能是一個網絡問題。如果您的odp.net安裝使用新的oracle主目錄(除非您進行了一些安裝後配置,否則我會期待),那麼tnsnames.ora可能會有所不同。 tnsnams中的主機名可能不完全合格,從而導致解決服務器更多延遲。我只希望在這種情況下第一次嘗試(而不是後續的嘗試)速度緩慢,所以我不認爲這是問題,但我認爲應該提及。
我不知道是否這是在不同的優化器設置(如first_rows vs all_rows)在c#vs sql開發人員。有關更多信息,請參閱[Tom Kyte撰寫的此文章](http://www.oracle.com/technetwork/issue-archive/2008/08-may/o38asktom-085659.html)。也許你可以檢查v $ sql和v $ sql_shared_cursor來查看你是否有多行用於同一個sql語句,如果是這樣,是否有不同的優化器模式是問題? – Boneist 2015-02-10 16:44:45