none
Lentitud en consulta con ROWID Dinámico RRS feed

  • Pregunta

  • Saludos,

    Tengo una consulta un tanto larga, que en resumen es más o menos en esta forma:

    select tbl.valor1, tbl.valor2
    from (select row_number() over (order by unatabla.id desc) as row, unatabla.valor1, unatabla.valor2)
    AS tbl WHERE tbl.row > 0 AND tbl.row < 11

    El objetivo es dado un conjunto de datos extraer un conjunto para un pagineo web. Trae los datos que quiero con un rowid perfectamente.

    El problema surge en la lentitud. La consulta interna se ejecuta veloz así que no hay problemas. Es decir la consulta que crea la tabla virtual TBL se ejecuta en 325 milisegundos. Pero cuando coloco el where externo (Para que sólo me devuelva los 10 primeros registros de la consulta de la tabla virtual -Que sólo trae unos pocos registros, 50, por ejemplo-) la consulta puede llegar a durar 40 segundos.

    ¿Alguna idea?

     

    martes, 24 de mayo de 2011 13:35

Respuestas

Todas las respuestas

  • Sin el plan de ejecución es difícil asegurar nada, pero apostaría a que el problema es que el motor está haciendo un table spool para poder filtrar por un campo que, en el fondo, es calculado ("row") y eso es lo que ralentiza la instrucción.

    ¿Existe un índice sobre "unatabla.id"? Si es así, podrías probar el siguiente script para la primera página

    SELECT tbl.valor1, tbl.valor2
    FROM (SELECT TOP 10  unatabla.valor1, unatabla.valor2 FROM unatabla ORDER BY unatabla.id DESC) AS tbl

    Para obtener la siguiente página podrías usar la misma instrucción pero filtrando a partir del último valor devuelto en la primera página

    martes, 24 de mayo de 2011 13:54
  • Bueno tendré que buscar como leer el plan de ejecución. Me ha parecido siempre cosa complicada lo del plan, pero ni modo a veces es necesario.

    El caso es que el query es dinámico dentro de un procedure que devuelve N cantidad de registros a partir de un @pagesize y @pagestart por lo que lo del top no me sirve. Ya que siempre no será rowid>0 y <11

    Me explico. Si el usuario presiona el link de la página 5, el procedure le tendría que devolver los registros con los rowsid del 50 al 59 en base al un orden cualquiera. Los registros del 50 al 59 ordenados por cédula o nombre o apellidos, por ejemplo.

    Me resulta muy raro que si la tabla interna es tan veloz y sólo devuelve 50 registros (en un ejemplo). Para hacer un filtro sobre esta tabla se tarde tanto.

     

    martes, 24 de mayo de 2011 14:24
  • Segun tu query, sera de ayuda tener un indice por " (id) include(valor1, valor2) ", para que sirva como fuente para la funcion de rango.

     


    AMB

    Some guidelines for posting questions...

    martes, 24 de mayo de 2011 15:39
  • Es que el query interno es muy rápido.

    Es decir:

    select tbl.valor1, tbl.valor2
    from (select row_number() over (order by unatabla.id desc) as row, unatabla.valor1, unatabla.valor2)
    AS tbl

    Es veloz. Menos de un cuarto de segundo. Devuelve una tabla en memoria con un campo ROWID y apenas 50 registros.

    El problema es que al aplicar

    WHERE tbl.row > 0 AND tbl.row < 11

    Tarda 40 segundos. :s sobre apenas 50 registros de un ejemplo

    martes, 24 de mayo de 2011 16:48
  • Si nos pasas el plan de ejecución seguramente podamos darte una explicación de porqué sucede eso
    martes, 24 de mayo de 2011 16:51
  •  Puedes pasarnos el plan de ejecucion en formato XML, activando el SHOWPLAN_XML, para que lo veamos, te dejo un enlace: http://technet.microsoft.com/es-es/library/ms190646.aspx

     Otra forma, si nos puedes poner una imagen:   http://technet.microsoft.com/es-es/library/ms172899(SQL.90).aspx

     Y aqui unos conceptos, para entender un poco los planes de ejecución: http://jose-gaitan.blogspot.com/2010/08/el-plan-de-ejecucion-en-sql-server.html

     


     Norman M. Pardell 

    ||Microsoft Certified IT Professional|| Database Administrator. Database Developer. SQL Server 2008

    martes, 24 de mayo de 2011 21:32
  • Hola.

    ¿Resolviste el problema? ¿Puedes aportar la información que te solicitaron?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/ Sígueme en twitter en http://twitter.com/qwalgrande

    martes, 31 de mayo de 2011 4:58
    Moderador