none
Consulta teórica/técnica sobre uso de tabla temporal para mostrar datos en SQL RRS feed

  • Pregunta

  • Buenas, he encontrado querys que tienen la siguiente estructura para mostrar en REPORTING SERVICES:

    DECLARE @TABLE TABLE (campo1, campo2. campo3,...campo N )  
    
    INSERT INTO @TABLE
    SELECT campo1, campo2, campo3, ... campo N) 
    FROM XXXX
    WHERE XXX
    
    SELECT * FROM @TABLE WHERE XXX

    Las consultas son:

    Es eficiente en cuanto a performance? Tengan en cuenta que es para un reporte el cual las consultas pueden ser inmensas. Tengo tablas de 8 millones de registros por lo que los reportes tardan algunos minutos en traer los resultados. Que técnicas se usan para aumentar la performance de los reportes? 

    Agradezco las sugerencias.

    Ss.

    Rodrigo Marozzi

    jueves, 7 de diciembre de 2017 17:23

Respuestas

  • Por lo general, se decide insertar filas a una tabla temporal, dentro de un procedimiento almacenado, cuando se requiere reutilizar un conjunto de datos en varias partes del procedimiento, la contención temporal de datos evita que debas volver a escribir la misma consulta cada vez que, en alguna parte del procedimiento almacenado, quieras referirte al mismo conjunto de resultados, claro, toma más relevancia y necesidad cuando la consulta es compleja y extensa. A su vez, es importante, como ya te habíamos comentado, decidir donde se contiene los datos de manera temporal, si la consulta retorna miles de filas convendrá contener los datos en una tabla temporal y beneficiarse de la indexación y demás ventajas, por lo contrario, si son cientos de filas quizá baste una variable de tipo table.

    Sin embargo, si buscas abstraer la "inteligencia del reporte" pero nada de lo comentado anteriormente sucederá dentro del procedimiento almacenado, entonces abstrae la complejidad de tu consulta en una vista (CREATE VIEW (Transact-SQL)), de hecho, la vista te servirá para ser utilizada en otros procedimientos sin necesidad de volver a escribir la misma consulta.

    jueves, 7 de diciembre de 2017 19:00

Todas las respuestas

  • Hola.

    Las variables tipo tablas que mencionas, residen en memoria y tengo entendido que este tipo de tablas son optimas para unos 100 registros solamente, mas de esa cantidad tu performance disminuye.

    Además de ello no veo sentido que utilices variables de tipo tabla para tus reportes.

    Saludos Cordiales.

    Cristian.


    DBA SQL Server Santiago/Chile

    jueves, 7 de diciembre de 2017 17:45
  • Para contener millones de filas lo mejor es insertarlas en una tabla temporal, claro, en caso de ser imperativo su creación, considerando definir los índices adecuados para optimizar las búsquedas. Una variable de tipo table es útil cuando la cantidad de filas a contener temporalmente no es grande.

    jueves, 7 de diciembre de 2017 17:47
  • Por lo que pude ver en los casos que usan tablas temporales como el ejemplo que pasé, pude deducir que esa tabla se va llenando de distintas consultas. Estas consultas pueden contener arboles de decisión, entonces toda la inteligencia del reporte, termina en una tabla temporal, para luego mostrarse en el reporte.

    Quizás sea como una capa más:

    Reporte

    tabla temporal

    inteligencia SQL

    Base de datos

    Que opinan al respecto? Les agradezco sus repuestas ya que son muy interesantes.


    jueves, 7 de diciembre de 2017 17:53
  • Por lo general, se decide insertar filas a una tabla temporal, dentro de un procedimiento almacenado, cuando se requiere reutilizar un conjunto de datos en varias partes del procedimiento, la contención temporal de datos evita que debas volver a escribir la misma consulta cada vez que, en alguna parte del procedimiento almacenado, quieras referirte al mismo conjunto de resultados, claro, toma más relevancia y necesidad cuando la consulta es compleja y extensa. A su vez, es importante, como ya te habíamos comentado, decidir donde se contiene los datos de manera temporal, si la consulta retorna miles de filas convendrá contener los datos en una tabla temporal y beneficiarse de la indexación y demás ventajas, por lo contrario, si son cientos de filas quizá baste una variable de tipo table.

    Sin embargo, si buscas abstraer la "inteligencia del reporte" pero nada de lo comentado anteriormente sucederá dentro del procedimiento almacenado, entonces abstrae la complejidad de tu consulta en una vista (CREATE VIEW (Transact-SQL)), de hecho, la vista te servirá para ser utilizada en otros procedimientos sin necesidad de volver a escribir la misma consulta.

    jueves, 7 de diciembre de 2017 19:00
  • Muchas gracias! 

    Sabias respuestas.

    lunes, 11 de diciembre de 2017 13:05