none
Table scan en una consulta. RRS feed

  • Pregunta

  • Por favor me podrian indicar en que casos  una consulta no lo toma el indice non-cluster.

    La siguiente consulta tiene un table scan por la tabla ca_operacion :

    Consideraciones: La tabla ca_operacion tiene un indice cluster por el campo op_operacion pero no lo toma porque???

    Intente crear un indice non-clustes por el campo op_operacion y op_estado pero tampoco funciono, por favor me pueden ayudar indicando porque no lo toma el indice de esta tabla.

    select
    '234' = op_operacion,
    '654' = op_oficina,
    '11009' = substring(gr_nombre,1,20)
    from ca_operacion a,cobis..cl_ente b, cobis..cl_grupo c, ca_transaccion d
    where
    op_operacion > isnull(1,0)
    and a.op_cliente = b.en_ente
    and b.en_grupo *= c.gr_grupo
    and a.op_operacion = tr_operacion
    and (a.op_moneda = @campo1 or @campo2 is null)
    and (a.op_oficial = @campo3 or @campo5 is null)
    and (a.op_cliente = @campo6 or @campo7 is null)
    and (b.en_grupo = @campo8 or @campo9 is null)
    and a.op_estado = 1
    and a.op_oficina = d.oa_codigo
    and ((op_fecha_ult between '01/01/2016' and '01/30/2016') or (tr_fecha_mov between '01/01/2016' and '01/30/2016'))
    and tr_secuencial = (select max(ab_secuencial) from ca_abono where ab_operacion = a.op_operacion and ab_estado = 'A')
    ORDER BY '234'



    CRIS

    domingo, 22 de abril de 2018 22:36

Todas las respuestas

  •  en que casos  una consulta no lo toma el indice non-cluster

    La respuesta a esto es relativamente sencilla: No se usa el índice cuando el optimizador de consultas evalúa que el costo de resolverla usando el índice es mayor que el de resolverla sin usarlo.

    Para evaluar el coste, el optimizador hace uso de las Statistics (una pequeña tablita auxiliar que guarda información sobre cuántos valores existen dentro de cada rango del índice, lo que le permite estimar cuántas filas aproximadamente satisfacen el valor buscado).

    ¿Por qué puede ser más costoso usar el índice non-clustered que no usarlo? Pues porque por cada valor que encuentra en el non-clustered, a continuación tiene que acudir al clustered para encontrar el resto de los campos del registro. Esto supone varios accesos al índice clustered por cada valor del non-clustered. Si las estadísticas indican que muchos registros van a satisfacer el non-clustered, al multiplicar ese número por la cantidad requerida de accesos al clustered puede ser que al final salgan más accesos que si se prescinde del non-clustered y se barre la tabla completa.

    lunes, 23 de abril de 2018 6:27
  • El or del ultimo where de la fecha puede estar haciendo ruido.

    Proba sin el or a ver si lee el indice y el tr_secuencial = (select max.....

    yo haria un cross apply en vez de una subquery y tendria un indice en ca_abono asi

    create index xx on ca_abono (ab_operacion,ab_estado) include( ab_secuencia)

    select
    '234' = op_operacion,
    '654' = op_oficina,
    '11009' = substring(gr_nombre,1,20)
    from ca_operacion a,cobis..cl_ente b, cobis..cl_grupo c, ca_transaccion d

    cross apply(

    select max(ab_secuencial) from ca_abono where ab_operacion = a.op_operacion and ab_estado = 'A')) as z


    • Editado LUIS TARZIA miércoles, 25 de abril de 2018 2:06
    miércoles, 25 de abril de 2018 2:06