[英]Oracle inconsistent performance behaviour of query
考慮以下查詢:
SELECT *
FROM (
SELECT ARRM.*, ROWNUM
FROM CRS_ARRANGEMENTS ARRM
WHERE
CONCAT(ARRM.NBR_ARRANGEMENT, ARRM.TYP_PRODUCT_ARRANGEMENT) >
CONCAT('0000000000000000', '0000')
ORDER BY
ARRM.NBR_ARRANGEMENT,
ARRM.TYP_PRODUCT_ARRANGEMENT,
ARRM.COD_CURRENCY)
WHERE ROWNUM < 1000;
該查詢在具有10000000條目的表上運行。 從Oracle SQL Developer或我的應用程序運行查詢時, 需要4分鍾才能運行 ! 不幸的是,這也是我正在編寫的應用程序內部的行為。 將值從1000更改為10完全沒有影響,表明它正在執行全表掃描。
但是,從SQuirreL運行時,查詢將在幾毫秒內返回。 那怎么可能? 在SQuirreL中生成的解釋計划給出:
但是對於相同的查詢,Oracle SQL Developer中生成了一個不同的解釋計划:
知道這種行為差異怎么可能嗎? 我無法理解。 我嘗試使用JPA和原始JDBC。 在應用程序中,我需要解析所有10000000條記錄,並且此查詢用於分頁,因此等待4分鍾不是一個選擇(這將花費27天)。
注意 :我在SQuirreL和我的應用程序中使用了相同的Oracle jdbc驅動程序,因此這不是問題的根源。
顯然,國家語言支持或NLS參數與它有關。 Oracle SQL Developer將其設置為“ Dutch”,這是基於您的語言環境的默認設置,而SQuirreL則將其設置為BINARY。 這種差異使優化器使用不同的路徑來解決查詢。 為了在jdbc會話中使用正確的NLS_SORT參數,需要使用以下命令:
ALTER SESSION SET NLS_SORT=BINARY
然后將在查詢上使用正確的索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.