2015-05-04 121 views
0

通過這個查詢避免全掃描上查詢

SELECT * FROM 
     (SELECT 
      T.*, 
      'T'||to_char(min(T.ORDEN_CAMPO) OVER (PARTITION BY T.NOMBRE_ESQUEMA, T.NOMBRE_TABLA, T.CONDICION_ADICIONAL ORDER by T.ORDEN_CAMPO)) ALIAS1 
     FROM SOLICITUDES.TBL_QRY_DINAMICO_SOLDEU T 
     WHERE 
      TIPO_QRY = 'SOLICITUD_DEU' AND 
      SUBTIPO_QRY = Numero_Seccion_in 
     ) 
    ORDER BY ORDEN_CAMPO 

執行的解釋計劃時,我得到一個表完整掃描。特別是在完成分區的部分。有沒有其他的方式來做同樣的邏輯?

在外部select語句中,如果我直接調用哪個值,我不會得到TFS,但是當我調用ALIAS1時,會出現TFS。

+2

你有索引ORDEN_CAMPO? –

+0

是否有特殊的外部查詢需求? order by可以被添加到內部查詢中。關於全表掃描,這是最快的操作之一,你基本上要求數據庫查看該表中的所有行。您可以添加一個觸發器,但取決於表大小和數據分佈,它可能不會提高性能。如果您需要訪問該表中的大量數據,則使用全表掃描代替索引實際上會更快。 – xionutz2k

+0

btw。在選擇MIN OVER PARTITION時,您不需要'T.DEREN_CAMPO'的ORDER –

回答

0
  1. 指數列ORDEN_CAMPO

  2. 什麼是TIPO_QRY = 'SOLICITUD_DEU' AND SUBTIPO_QRY = Numero_Seccion_in過濾行的份額?如果少於10%,則索引兩列。

  3. 你可以嘗試索引中的列NOMBRE_ESQUEMA,NOMBRE_TABLA和CONDICION_ADICIONAL

注:爲@ xionutz2k已經提到的,全表掃描可以在某些比索引掃描更有效的情況。如果您提到了所有索引並且解釋計劃總是顯示全表掃描,那麼它是可以的。