避免查询全扫描

时间:2015-05-04 14:56:39

标签: sql oracle query-optimization

通过此查询

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

执行解释计划时,我得到一个TABLE FULL SCAN。特别是在完成分区的部分。还有其他方法可以做同样的逻辑吗?

在外部select语句中,如果我直接调用我想要获取的值,我不会得到TFS但是当我调用ALIAS1时,会出现TFS。

1 个答案:

答案 0 :(得分:0)

  1. 索引列ORDEN_CAMPO

  2. TIPO_QRY = 'SOLICITUD_DEU' AND SUBTIPO_QRY = Numero_Seccion_in过滤的行的份额是多少?如果小于10%,则索引两列。

  3. 您可以尝试索引列NOMBRE_ESQUEMA,NOMBRE_TABLA和CONDICION_ADICIONAL

  4. 注意:正如@ xionutz2k已经提到的,全表扫描在某些情况下可能比索引扫描更有效。如果您提到了所有索引并且解释计划始终显示全表扫描,那么就可以了。