SELECT * FROM (SELECT r_t.*, ROWNUM r_rownum FROM ( select /*+rule*/ subscribersn from subscriberrentinfo where version >= :1 and version <= :2 ) r_t WHERE ROWNUM < :3 ) WHERE r_rownum >= :4
性能測驗時發現此行陳述句執行時耗時最多,CPU使用率98%,請問如何進行優化
uj5u.com熱心網友回復:
貼出執行計劃,光一個陳述句,看不出什么來。uj5u.com熱心網友回復:
貼一下執行計劃吧。。uj5u.com熱心網友回復:
Oracle是什么版本? 如果是10g,11g,12c,請把/*+rule*/ 提示去掉。uj5u.com熱心網友回復:
條件的不可控性太大了,這個分頁sql不可能在所有條件下都能被優化uj5u.com熱心網友回復:
如果滿足這個version條件的資料很少很少,那么version上面的索引可解決問題,與分頁無關,如果滿足這個條件的資料非常非常多,幾乎奔著全表去了,那么第一頁的結果也應該很快,但是如果滿足條件的資料不多不少,那就尷尬了。
uj5u.com熱心網友回復:
一不小心就三連:如果是第二種情況:滿足條件的資料很多,那么你那/*rule*/提示就更尷尬了,去掉吧。
另外,把這事情扯的更復雜點:因為使用了系結變數,version取值不同的時候,sql的執行計劃可能會做出一些調整,這個與你的資料庫版本,包括某些系結變數相關的引數設定都會造成一些影響,這個要視情況而定了,比如bind peeking打開與否?ACS打開與否,cardinality feedback打開與否?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/60620.html
標籤:開發
