none
Indice Tabla RRS feed

  • Pregunta

  • Hola.

    Tengo esta consulta.

    Select Rut,Sexo
    From Tabla
    Where (persona='O') or (persona<>'O' and sexo NOT IN ('M','F'))
    Group By Rut,Sexo,persona

    Y tengo 2 índices NONCLUSTERED:

    Uno por: Rut,Sexo,persona

    Otro por : Sexo,Persona

    Cuando veo el plan de ejecución hace un Table Sacan a la tabla ocupando el 62%

    Atte.


    DBA SQL Server Santiago/Chile

    martes, 23 de agosto de 2016 14:55

Respuestas

  • Cual version de SQL Server usas?

    Las estadisticas almacenadas en el histograma corresponden siempre a la primera columna de la clave del indice y si esta tiene alta densidad (pocos valores unicos) y que la selectividad del predicado sea baja (muchas filas seran devueltas), entonces puede ser mas factible escanear la tabla que usar el indice seguido de un index seek (lookup), al menos que el indice sea cubierto (persona, sexo, rut).

    Preguntas?

    - Cuantos valores distintos tienes en las columnas [persona] y [sexo]?

    - Por que usas GROUP BY si no usas funcion de agrupacion alguna?

    Me pregunto si serviria crear dos indices nonclustered filtrados:

    -- (persona, sexo, rut) where persona = 'O'

    -- (persona, sexo, rut) where persona <> 'O' and sexo <> 'M' and sexo <> 'F'

    Luego usa dos queries que permitan usar cada indice por separado y unir los resultados.

    SELECT DISTINCT persona, sexo, rut
    FROM dbo.T1
    WHERE persona = 'O'
    UNION ALL
    SELECT DISTINCT persona, sexo, rut
    FROM dbo.T1
    WHERE persona <> 'O' AND sexo <> 'M' AND sexo <> 'F';
    GO


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas




    martes, 23 de agosto de 2016 18:11

Todas las respuestas

  • Saludos,

    Cuantos registros tiene la tabla y intenta crear un indice que solo contenga persona y sexo en este orden. no deberia de afectar pero es posible que el motor considere que es mas rapido el uso de un scan que un seek asi que dime cuantos registros tienes en la tabla.  

    martes, 23 de agosto de 2016 15:16
  • La tabla tiene indice Cluster? otro punto es que cuando tenes clausulas OR los inices no funcionan de foma Seek y van por los Scan

    Carlos Ignacio Aguero. DBA SQL Server. Toda mi respeto al pueblo Peruano por la ayuda prestada en la guerra de Malvinas.

    martes, 23 de agosto de 2016 15:43
  • CMAPM,

    En la consulta que presentas creo -a menos que despertar temprano me esté afectando :( - la expresión 'persona <> 'O'' es innecesaria:

    SELECT 
    	RUT, SEXO
    FROM 
    	Tabla
    WHERE 
    	(persona = 'O') OR (sexo NOT IN ('M','F'))
    GROUP BY 
    	Rut, Sexo, persona;

    En caso la primera expresión sea válida no importará el resultado de la segunda, en caso la primera expresión sea falsa será porque persona no es 'O' por tanto creo que es redundar sobre el resultado.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 23 de agosto de 2016 15:51
  • Hola.

    La tabla tiene 200.000 registros.

    No tiene indice clustered y tampoco lo puedo crear pues es de un tercero, pero si hay alguna idea en esto podria intentar crear una de prueba.

    Cree un indice persona,sexo en ese orden y sigue haciendo table scan.

    Tenias razon con sexo <>'O' lo sque aún asi hace table scan.

    Saludos y atento a cualquier sugerencia.


    DBA SQL Server Santiago/Chile

    martes, 23 de agosto de 2016 16:00
  • Tenes varios puntos, no tener Cluster index y OR en el where, vas a caer en un table scan. A no ser que re-escribas tu query

    Carlos Ignacio Aguero. DBA SQL Server. Toda mi respeto al pueblo Peruano por la ayuda prestada en la guerra de Malvinas.

    martes, 23 de agosto de 2016 17:49
  • Cual version de SQL Server usas?

    Las estadisticas almacenadas en el histograma corresponden siempre a la primera columna de la clave del indice y si esta tiene alta densidad (pocos valores unicos) y que la selectividad del predicado sea baja (muchas filas seran devueltas), entonces puede ser mas factible escanear la tabla que usar el indice seguido de un index seek (lookup), al menos que el indice sea cubierto (persona, sexo, rut).

    Preguntas?

    - Cuantos valores distintos tienes en las columnas [persona] y [sexo]?

    - Por que usas GROUP BY si no usas funcion de agrupacion alguna?

    Me pregunto si serviria crear dos indices nonclustered filtrados:

    -- (persona, sexo, rut) where persona = 'O'

    -- (persona, sexo, rut) where persona <> 'O' and sexo <> 'M' and sexo <> 'F'

    Luego usa dos queries que permitan usar cada indice por separado y unir los resultados.

    SELECT DISTINCT persona, sexo, rut
    FROM dbo.T1
    WHERE persona = 'O'
    UNION ALL
    SELECT DISTINCT persona, sexo, rut
    FROM dbo.T1
    WHERE persona <> 'O' AND sexo <> 'M' AND sexo <> 'F';
    GO


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas




    martes, 23 de agosto de 2016 18:11