Profiling de Listados

Creado por Pablo Céspedes, Modificado el Mie, 15 Abr a 3:08 P. M. por Pablo Céspedes

Activación

Para obtener datos de rendimiento de los listados, debe tener activa la opción "SQL Trace activo", disponible para cualquier administrador pulsando en la cabecera de un formulario el botón derecho. A continuación, genere el listado normalmente. 



A partir de este momento se guardarán las métricas y los pasos por los que transcurre la carga, con información ampliada, para los listados de tipo DevExpress. Existe una funcionalidad muy limitada que mide tiempos de forma básica en Crystal Reports, pero no aplica la mayoría de información del siguiente documento.


Para consultar la información, abra el SQL Tracer y asegúrese de que los filtros ListadoPaso y ListadoResumen estén marcados (checkboxes en la parte superior derecha del formulario).


Columnas del grid

ColumnaContenido
Número secuencial de la traza. Le permite ordenar cronológicamente.
FechaFecha y hora del evento (formato corto con HH:MM).
TiempoDuración en segundos con 3 decimales (ej: 0,167 = 167 ms). Para las líneas de tipo ListadoResumen, indica el tiempo total del listado completo.
TipoListadoPaso para cada fase individual, ListadoResumen para el total final.
DescripTexto descriptivo del paso. Estructura: [Motor] Fichero.repx - NombrePaso: X ms (Y s).
DetallesPulse el botón en esta columna para ampliar información.

Cómo leer la columna Descrip

El prefijo entre corchetes indica el motor y la operación:

  • [DX-E]: DevExpress — Exportación directa (a PDF, Excel, etc.)

  • [DX-P]: DevExpress — Vista previa en pantalla

  • [CR-E]: Crystal Reports — Exportación

  • [CR-P]: Crystal Reports — Vista previa

Pasos principales (secuenciales)

PasoQué mide
XtraReport.FromFileCarga del fichero .repx desde disco a memoria.
FlexybilizaReportCompletoFusión de DataSources de subreports en el DataSource del informe padre.
>> DataSourceDemandedInicio de la preparación de consultas (conexión, generación SQL, inyección WHERE).
<< DataSourceDemandedFin de la preparación. N subs indica cuántos subreports se han detectado.
CreateDocumentTiempo total de generación (ejecución SQL, llenado de datos y renderizado).
Exportar a...Serialización del documento al formato solicitado.

Subpasos detallados (dentro de CreateDocument)

PasoQué mide
CreateDoc.Fill SQL principalTiempo de ejecución de la consulta principal en SQL Server.
CreateDoc.Subreports (total)Tiempo acumulado de todos los subreports.
Sub: [Nombre] ×NTiempo de un subreport concreto. ×N es el número de veces que se ejecutó.
CreateDoc.Render principalTiempo de maquetación de páginas (motor DevExpress).
PostCreate.RowCountsFilas devueltas por consulta. Ejemplo: subreport=53. Útil para detectar exceso de datos.

Preparación SQL (dentro de DataSourceDemanded)

  • Connection.Open: Apertura de conexión (suele ser 0 ms si hay pooling).

  • GetSql: Tiempo de traducción de la consulta visual a texto SQL.

  • RecordSelectionFormula: Muestra el filtro aplicado (ej: IdDoc = 6378).

  • WHERE-INJECT: Filtro inyectado directamente en la tabla.

  • WHERE-INJECT-FK: Filtro mediante subselect de clave foránea (optimizado para servidor).

  • WHERE-NOINJECT: No se pudo filtrar en servidor; la consulta trae todos los datos y filtra en memoria (lento).


Cuándo pulsar el botón «Detalles» (Columna D)

  1. En ListadoResumen: Muestra un informe completo con porcentajes de tiempo. Es la mejor forma de ver el "cuello de botella" de un vistazo.

  2. En WHERE-INJECT / FK: Permite ver la cláusula SQL exacta inyectada para validarla.

  3. En DataSourceDemanded.GetSql: Muestra el SQL completo (JOINs y Select). Copie este código para probarlo directamente en SSMS si la consulta es lenta.

  4. En pasos "Sub:" elevados: Identifica exactamente qué subreport está penalizando el tiempo.


Resumen de diagnóstico rápido

  1. Localice la línea ListadoResumen para ver el tiempo total.

  2. Si el mayor tiempo es Fill SQL principal → Optimice la consulta principal.

  3. Si el mayor tiempo es un Sub: específico → El problema es ese subreport o su falta de filtrado.

  4. Si el mayor tiempo es Render principal → El diseño del informe es muy complejo (muchos elementos visuales), no es un problema de SQL.

  5. Revise PostCreate.RowCounts → Si una consulta devuelve miles de filas innecesarias, falta un filtro WHERE.

¿Le ha sido útil este artículo?

¡Qué bien!

Gracias por sus comentarios

¡Sentimos mucho no haber sido de ayuda!

Gracias por sus comentarios

¡Háganos saber cómo podemos mejorar este artículo!

Seleccione al menos una de las razones
Se requiere la verificación del CAPTCHA.

Sus comentarios se han enviado

Agradecemos su esfuerzo e intentaremos corregir el artículo