2010-07-07 14 views
6

Tengo una tabla SQL con un millón de entradas y traté de consultar cuántas entradas son anteriores a 60 días (Oracle 11.2. 0.1.0).¿Por qué una consulta con una selección secundaria cuesta menos que la consulta con una constante en Oracle

Para este experimento utilicé 3 versiones diferentes de la sentencia de selección:
(El costo-valor viene dado por TOAD para Oracle V. 9.7.2.5)

  1. select count(*) from fman_file
    where dateadded >= (select sysdate - 60 from dual)

    Coste: 65

  2. select count(*) from fman_file
    where dateadded >= sysdate - 60

    Costo: 1909

  3. select count(*) from fman_file
    where dateadded >= sysdate - numtodsinterval(60,'day')

    Costo: 1884

  4. select count(*) from fman_file where dateadded >= '10.10.2009'
    Costo: 1823
    (El 10.10.2009 es sólo un ejemplo actualizados !!!)

que no tienen el tiempo exacto -valores para todas las consultas en mente, pero el primero realmente fue el más rápido.

Así que probé algunas consultas más selectas con otras subselecciones (como (Seleccionar 1000 desde dual)) y fueron (a veces MÁS) más rápidas que las otras con valores constantes. Incluso parece que este "CUALQUIER COSA" (Error/Característica) está sucediendo en MySQL también.

Entonces, ¿alguien puede decirme por qué la primera consulta es (camino) más rápida que las otras?

Greetz

P.S .: No se trata de la sydate! La pregunta es ¿POR QUÉ LA VARIACIÓN CON (SELECCIONAR) MÁS RÁPIDA QUE LOS DEMÁS? (con un pequeño enfoque en Select-Variation (1.) vs. Constant-Variation (4.))

+1

no se puede decir por qué, pero si Estamos tratando de determinar los recuentos de registros MÁS DE 60 días, ¿no se revoca su operador relacional? – DCookie

+0

Puedo reproducir este efecto también en 10.2.0.2.0, pero la diferencia es mucho más pequeña: 4723 con subselección, 4736 con comparación simple. –

+1

Un "costo" menor no significa necesariamente "más rápido". Aunque podría tener algún valor en una consulta muy simple como la suya, normalmente no puede comparar los valores de costo de una consulta a otra. Su propósito es comparar diferentes * planes * para la misma consulta. –

Respuesta

0

¿Has vuelto a intentar los números 2-4 con() alrededor del cálculo después de> = - parece para mí, la primera afirmación es la única donde calcula ese valor una vez; para todos los demás, recalcula en cada fila. por ejemplo:

select count(*) from fman_file where dateadded >= (SELECT sysdate - 60) 

select count(*) from fman_file where dateadded >= (SELECT (sysdate - numtodsinterval(60,'day')) 

select count(*) from fman_file where dateadded >= (SELECT CONVERT(datetime,'10.10.2009')) 

NB - no conocen la sintaxis para convertir a una fecha y hora en Oracle - pero se entiende la idea.

1

Tom Kyte:

La ventaja dual es el optimizador entiende dual es un una fila especial, mesa de una columna de - cuando lo utiliza en las consultas, utiliza este conocimiento para desarrollar el plan de .

3

encontrado algunas pistas en mi copia de "Fundamentos de Oracle basadas en los costes" por Jonathan Lewis en el capítulo 6 " sorprendente sysdate ". Esto parece aplicarse a 9i, probablemente también a versiones posteriores.

El sysdate trata Optimizer (y trunc (sysdate) y algunas otras funciones de sysdate) como constantes conocidas en tiempo de análisis, pero sysdate + N se convierte en un desconocido, y obtiene el mismo tratamiento como una variable bind - que significa una selectividad fija del 5%. (Nota en particular, que sysdate + 0 dará una cardinalidad diferente de sysdate.)

Aparentemente el optimizador también reconoce la select sysdate from dual como una constante conocida.

0

en lugar de utilizar (seleccione sysdate - 60 de Driver) i, bastante recomiendo que se unen mediante una variable, cuyo valor se calcula antes de la consulta se convierta ejecutados

Cuestiones relacionadas