簡體   English   中英

Oracle查詢性能行為不一致

[英]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中生成的解釋計划給出:

在SQuirreL中解釋計划

但是對於相同的查詢,Oracle SQL Developer中生成了一個不同的解釋計划:

在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.

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