Saltar al contenido

Depuración y Mejora del Rendimiento

Herramientas Desarrollador de Chrome

Chrome DevTools es un conjunto de herramientas desarrollador web integradas directamente en el navegador Google Chrome. Con las herramientas de desarrollo de Chrome, puede diagnosticar problemas en App Builder con solicitudes que no se responden o manejan correctamente, registre un archivo HAR que se utiliza para solucionar problemas adicionales y ayuda a identificar problemas con los tiempos de carga de la página.

Chrome DevTools también proporciona herramientas para capturar capturas de pantalla, emular la experiencia de un usuario móvil y analizar las solicitudes que realiza la página a medida que se carga para identificar áreas específicas que impactan el tiempo de carga de la página.

Nota

Para descargar Google Chrome: https://www.google.com/chrome/

Cómo Identificar Códigos de Error HTTP con Chrome

Chrome DevTools le permite ver y filtrar rápidamente códigos de error HTTP para ayudar a aislar e identificar un error con an App Builder solicitud de aplicación que no se responde o no se maneja correctamente. Los códigos de estado de respuesta HTTP indican si una solicitud HTTP específica se ha completado correctamente.

Desde la pestaña Red de Chrome DevTools, puedes filtrar rápidamente la información resultante haciendo clic en los encabezados de las columnas. Aquí puedes hacer clic en Estado para ver los resultados del código HTTP e identificar las tareas que no devuelven un resultado 200 OK.

Pestaña de red de Chrome

En el ejemplo de captura de pantalla, desde la pestaña Red de Chrome DevTools, vemos que la página de la aplicación arroja mensajes de error 500 Error interno del servidor y 504 Tiempo de espera de la puerta de enlace. La información contenida en la columna Nombre de este resultado ayuda a definir dónde se encuentra la página. App Builder este error se está iniciando.

A continuación, se incluye una lista de los resultados de código de error HTTP más comunes:

  • 301 Movido permanentemente
  • 302 Encontrado
  • 307 Redireccionamiento temporal
  • 308 Redireccionamiento permanente
  • 400 Solicitud incorrecta = Error del cliente
  • 401 No autorizado = Error del cliente
  • 403 Prohibido = Error del cliente
  • 404 No encontrado = Error del cliente
  • 405 Método no permitido = Error del cliente
  • 500 Error interno del servidor = Error del servidor
  • 502 Puerta de enlace incorrecta = Error del servidor
  • 503 Servicio no disponible = Error del servidor
  • 504 Tiempo de espera de la puerta de enlace = Error del servidor

Nota

Para obtener más códigos de error HTTP, consulte: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status

Generar un Archivo Har con Chrome

Al solucionar problemas complejos App Builder problemas, tener un archivo HAR grabado y generado desde las herramientas de Chrome Web Developer puede ser útil y/o solicitado por an App Builder El desarrollador puede identificar y solucionar problemas con más detalle. Un archivo HAR captura un registro de las solicitudes y la actividad de la red en el momento en que se produce el problema en cuestión. En concreto, un HAR es un formato de archivo de almacenamiento en formato JSON para registrar la interacción de un navegador web con un sitio.

Para Generar un Archivo Har:

  1. Abra Google Chrome y vaya a la App Builder página donde ocurre el problema
  2. Desde la barra de menú de Chrome, seleccione Ver > Desarrollador > Herramientas para desarrolladores
  3. Desde el panel abierto en la parte inferior de la pantalla, seleccione la pestaña Red
  4. Busque el botón rojo redondo Grabar en la esquina superior izquierda de la pestaña Red y asegúrese de que esté rojo. Si está gris, haga clic en él una vez para comenzar a grabar.
  5. Marque la casilla junto a Conservar registro
  6. Haga clic en el botón Borrar para borrar todos los registros existentes de la pestaña Red.
  7. Ahora intenta reproducir el problema que estabas experimentando antes, mientras se graban las solicitudes de red.

    Har

  8. Una vez que reproduzca el problema, haga clic derecho en la cuadrícula de solicitudes de red, seleccione Guardar como HAR con contenido y guarde el archivo en su computadora.

Para obtener más información: consulte "Comience a analizar el rendimiento de la red en Chrome DevTools" https://developers.google.com/web/tools/chrome-devtools/network-performance/

Identificación de Problemas de Rendimiento con Chrome

Chrome DevTools Las herramientas pueden ayudar a identificar problemas de rendimiento en su App Builder aplicación. Si primero navega a la página donde está experimentando un problema de rendimiento, puede abrir DevTools y echar un vistazo a la pestaña Red y ordenar por la columna Tiempo. Ordene de modo que pueda ver qué solicitudes demoran más tiempo. Las columnas Nombre e Iniciador correspondientes le brindan información adicional sobre la solicitud que se origina en la aplicación. App Builder aplicación.

Tenga en cuenta que si en los resultados de la pestaña Red descubre que las solicitudes denominadas filter? ocupan la mayor parte del tiempo de carga de la página, esto indica que probablemente necesite optimizar el objeto comercial correspondiente.

Los objetos de negocio (u objetos de datos) pueden ser una fuente de tiempos de carga de páginas lentos. Si identifica que una solicitud de ejecución prolongada se origina en un objeto de negocio, consulte la siguiente sección que describe los motivos por los que un objeto de datos es lento y las opciones para mejorar la velocidad.

Razones por las Que un Objeto Comercial Es Lento y Opciones para Mejorar la Velocidad

Dependiendo de la forma en que estén configurados, los objetos de negocio (también denominados objetos de datos) pueden ser una causa de App Builder problemas de rendimiento o lentitud de la aplicación. Las razones específicas por las que un objeto de negocio podría ser lento incluyen:

  • La lógica SQL contiene muchas subconsultas
  • Se utilizan columnas innecesarias en la lógica
  • Las cláusulas Where no utilizan instrucciones compatibles con índices
  • Los índices no están definidos en una o más tablas que utiliza un objeto de datos
  • Índices redundantes en las tablas a las que hace referencia la lógica SQL
  • Unión en columnas calculadas
  • El uso del índice puede perderse debido a la ejecución de la lógica a través de funciones
  • El campo binario se incluye cuando un panel no lo utiliza
    • Solo incluya campos binarios en objetos de negocio si se utilizan como control de archivo
    • Vale la pena crear objetos de negocio específicamente para utilizarlos en paneles donde se carga o descarga un archivo
  • Todas las columnas de un objeto de negocio se cargarán mediante App Builder para las siguientes condiciones:
    • Existe formato condicional
    • Si un campo tiene habilitada la opción Admite sustitución
    • Si un panel tiene reglas de visibilidad no estáticas

Los objetos de negocio pueden seguir provocando tiempos de carga lentos en las páginas de la aplicación, incluso si los "Resultados" del objeto de negocio resultante se cargan rápidamente. Verifique si hay elementos en la página de su aplicación que afecten la velocidad, como la clasificación, los cuadros de lista u otras configuraciones de la capa de interfaz de usuario que puedan provocar tiempos de carga de página más lentos.

Aplanamiento de Consultas SQL

Si ha identificado que un objeto comercial específico está causando problemas de rendimiento, puede existir la oportunidad de mejorar la lógica SQL y potencialmente simplificar la consultar.

  • La mayoría de las veces debes reutilizar las subconsultas.
  • A veces, una consultar puede llegar a ser tan grande con subconsultas anidadas que se ejecuta lentamente; solo entonces debe revisarse y reescribirse.
  • Aplanar la consultar (eliminar subconsultas innecesarias) generalmente mejora el rendimiento
  • Puede examinar el plan de ejecución y los índices.

Eliminar Columnas No Utilizadas

A menudo, las consultas con problemas de rendimiento utilizan columnas en la lógica SQL que son innecesarias.

  • Con frecuencia encontramos que las consultas con problemas de rendimiento tienen subconsultas que seleccionan muchos más datos que los que utiliza la consultar externa.
  • Eliminar estas columnas (en particular las columnas que se calculan) mejorará el rendimiento.
  • Utilice la regla de copia y comience a realizar cambios
  • Calcula el tiempo que tarda en aparecer "Resultados". También calcula el tiempo que tarda en aparecer "Cargar más filas".

Declaraciones de Índice Amigables en Cláusulas WHERE

La cláusula Where define la condición de búsqueda de una sentencia SQL y, por lo tanto, cae dentro del dominio funcional principal de un índice: encontrar datos rápidamente. Una cláusula Where mal escrita suele ser la culpable de una consultar SQL de ejecución lenta. Una cláusula Where debe ser eficiente e incluir los índices correctos.

Malo (no se utilizarán índices):

  • Donde LOWER(Nombre) como '%Bob%
  • Donde AHORA() > DATEADD(minutos,60,HoraInicio)

Bueno (índices utilizados):

  • Donde Nombre como 'Bob%'
  • Donde DateAdd(minutos,-60,AHORA()) > HoraInicio

SQL Server tiene un modo de seguimiento y utilidades de plan de consultar que puede ejecutar para ver si se están utilizando índices.

Configuraciones para Mejorar el Rendimiento

Esta sección ilustrará las configuraciones en App Builder que afectan el rendimiento. Evite buscar/filtrar/ordenar en columnas de tablas grandes que no están indexadas, cuando se detectan consultas lentas y los índices no son una opción.

En el nivel del Panel, habilitar Descarga de soporte y tener la Búsqueda simple activada y configurada como Solo indexada puede ayudar a mejorar el rendimiento.

Nota

Al buscar campos indexados, App Builder genera consultas compatibles con índices:

…FirstName like 'Bob%'…
Will match: "Bob Smith"
Will not match: "Mr Bobert"

Índices y Qué Debe Indexarse

En SQL, un índice se utiliza para acelerar el rendimiento de las consultas al ayudar a recuperar los datos más rápidamente de SQL Server. Esto se logra al reducir la cantidad de páginas de datos de la base de datos que se deben visitar o escanear. Al pensar en índices en App Builder objetos de datos: necesita suficientes índices para acelerar sus consultas SELECT y, al mismo tiempo, no debe crear índices redundantes que podrían ralentizar sus operaciones UPDATE/DELETE.

Las arquitecturas de índice se clasifican como agrupadas o no agrupadas. Los índices agrupados son índices cuyo orden de las filas en las páginas de datos corresponde al orden de las filas en el índice. Por eso, solo puede existir un índice agrupado en una tabla determinada, mientras que pueden existir muchos índices no agrupados en la tabla.

App Builder los índices se crean en objetos de tabla. En términos generales, cada tabla debe tener un índice agrupado para permitir una búsqueda eficiente de los datos en esa tabla. Cuando a una tabla le falta un valor de índice, eso puede contribuir a reducir la velocidad de una aplicación. Asegúrese de que la clave principal de cada tabla y cualquier columna de clave única que exista estén indexadas. Al considerar la modificación de índices en App Builder, tenga en cuenta los siguientes puntos clave:

  • Debe equilibrar la creación de índices con el impacto en el rendimiento que esto va a tener en las declaraciones de inserción/actualización. Agregar índices acelerará las consultas, pero ralentizará las de inserción/actualización/eliminación.
  • También debe considerar la indexación de las columnas que utiliza para ordenar y las que utiliza en una expresión de agrupación. Puede resultar beneficioso indexar las columnas que utilizan las funciones MIN(), MAX(), COUNT(), SUM() y AVG() para agregar los datos.
  • Puede aprovechar los "índices de cobertura", donde tiene un índice más grande que puede aprovecharse mediante consultas que utilizan subconjuntos de las columnas.
    • El orden de las columnas en el índice es importante.
    • La recomendación es que las columnas de desigualdad vayan después de las columnas de igualdad en los índices de cobertura.

Faltan Herramientas de Índice

Existen utilidades y consultas de SQL Server que se pueden aprovechar para ayudar con el proceso de revisión de índices. Las vistas de administración dinámica (DMV) son utilidades de SQL Server que devuelven información sobre el estado del servidor y se pueden usar para supervisar el estado del servidor de base de datos y diagnosticar problemas. Las DMV brindan una gran perspectiva sobre lo que sucede dentro de SQL Server. Para ejecutarlas, se requiere el permiso VIEW DATABASE STATE en la base de datos en cuestión.

Puede identificar índices faltantes en sus consultas SQL de tres maneras principales:

  • Ejecución del Asesor de optimización del motor de base de datos
  • Ejecución de vistas de administración dinámica de índices faltantes
  • SQL Server Engine indica los índices faltantes al generar planes de ejecución en SSMS

A continuación se presentan tres consultas SQL que se utilizan a menudo para ayudar a identificar problemas con los índices:

FindingLongRunningQueries.sql
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT TOP 20
CAST(qs.total_elapsed_time / 1000000.0 AS DECIMAL(28, 2))
AS [Total Duration (s)]
, CAST(qs.total_worker_time * 100.0 / qs.total_elapsed_time
AS DECIMAL(28, 2)) AS [% CPU]
, CAST((qs.total_elapsed_time - qs.total_worker_time)* 100.0 /
qs.total_elapsed_time AS DECIMAL(28, 2)) AS [% Waiting]
, qs.execution_count
, CAST(qs.total_elapsed_time / 1000000.0 / qs.execution_count
AS DECIMAL(28, 2)) AS [Average Duration (s)]
, SUBSTRING (qt.text,(qs.statement_start_offset/2) + 1,
((CASE WHEN qs.statement_end_offset = -1
THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2) + 1) AS [Individual Query]
, qt.text AS [Parent Query]
, DB_NAME(qt.dbid) AS DatabaseName
, qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
WHERE qs.total_elapsed_time > 0
ORDER BY qs.total_elapsed_time DESC
IdentifyMostImportantMissingIndexes.sql
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT TOP 20
    ROUND(s.avg_total_user_cost *s.avg_user_impact*  (s.user_seeks + s.user_scans),0) AS [Total Cost]
 , d.[statement] AS [Table Name]
 , equality_columns
 , inequality_columns
 , included_columns
FROM sys.dm_db_missing_index_groups g
    INNER JOIN sys.dm_db_missing_index_group_stats s
        ON s.group_handle = g.index_group_handle
    INNER JOIN sys.dm_db_missing_index_details d
        ON d.index_handle = g.index_handle
WHERE d.database_ID = DB_ID()
ORDER BY`[Costo total] `DESC
IdentityUnusedIndexes.sql
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT
    DB_NAME() AS DatabaseName
 , SCHEMA_NAME(o.Schema_ID) AS SchemaName
 , OBJECT_NAME(s.[object_id]) AS TableName
 , i.name AS IndexName
 , s.user_updates
 , s.system_seeks + s.system_scans + s.system_lookups AS [System usage]
INTO    #TempUnusedIndexes
FROM    sys.dm_db_index_usage_stats s
    INNER JOIN sys.indexes i
        ON s.[object_id] = i.[object_id]
        AND s.index_id   = i.index_id
    INNER JOIN sys.objects o
        ON i.object_id   = O.object_id
WHERE     1=2

EXEC sp_MSForEachDB 'USE [?];
INSERT INTO #TempUnusedIndexes
SELECT TOP 20
    DB_NAME() AS DatabaseName
 , SCHEMA_NAME(o.Schema_ID) AS SchemaName
 , OBJECT_NAME(s.[object_id]) AS TableName
 , i.name AS IndexName
 , s.user_updates
 , s.system_seeks + s.system_scans + s.system_lookups
    AS [System usage]
FROM    sys.dm_db_index_usage_stats s
    INNER JOIN sys.indexes i
        ON s.[object_id] = i.[object_id]
        AND s.index_id = i.index_id
    INNER JOIN sys.objects o ON i.object_id = O.object_id
WHERE     s.database_id = DB_ID()
AND     OBJECTPROPERTY(s.[object_id], ''IsMsShipped'') = 0
AND     s.user_seeks = 0
AND     s.user_scans = 0
AND     s.user_lookups = 0
AND     i.name IS NOT NULL
ORDER BY s.user_updates DESC'

SELECT     TOP 20 *
FROM     #TempUnusedIndexes
ORDER BY`[actualizaciones de usuario] `DESC
DROP TABLE #TempUnusedIndexes

Uso de Sentencias SQL Desde Registros y Optimizador de Índices

Una vez que haya identificado un objeto comercial que tiene problemas de rendimiento, puede recuperar la lógica de la declaración SQL desde el App Builder logs y ejecútelo a través de una utilidad optimizadora de índices para identificar áreas de mejora. Esto podría dar como resultado la identificación de índices que se deben agregar, por ejemplo.

Para recuperar la lógica de la declaración SQL, navegue en la aplicación hasta la página donde se está utilizando el objeto comercial. Desde aquí:

  1. Vaya a IDE > Monitoreo
  2. Haga clic en Registros de base de datos en el menú
  3. Haga clic en el botón Editar configuración
  4. Haga clic en Editar
  5. En la sección Configuración de registro de memoria, configure la Gravedad mínima en Seguimiento.

    Importante

    Siempre restablezca el valor de Gravedad mínima a Desactivado cuando termine de capturar la información de registro.

  6. Haga clic en el botón Guardar

  7. Ahora debería estar viendo la pantalla Registros rápidos en App Builder, que consta de 500 líneas de datos de registro (a menos que modifique ese valor de 500). Desplácese por los datos de registro hasta que encuentre la lógica de la declaración SQL que está buscando.
  8. Copie toda la lógica de la declaración SQL, comenzando con SELECT. Por ejemplo:

    SQL

  9. Haga clic en el botón Editar configuración

  10. Haga clic en Editar en la pantalla Configuración de registro
  11. En la sección Configuración del registro de memoria, configure la Gravedad mínima en Desactivado
  12. Inicie SQL Server Management Studio
  13. Conéctese a su conexión de base de datos
  14. Hay algunas rutas diferentes que puede aprovechar en SQL Server Management Studio para optimizar mejor parte de la lógica de las declaraciones SQL que utiliza su aplicación.
  15. Puede hacer clic en el botón Nueva consulta y configurar la base de datos disponible en la base de datos correspondiente a la aplicación que está revisando.
  16. Ingrese la siguiente sintaxis de consultar, que es una consultar para encontrar las 10 consultas SQL principales que utilizan la mayor cantidad de recursos (lecturas, escrituras, tiempo de trabajo (CPU), etc.):

    Seleccionar los 10 mejores

  17. Haga clic en el botón Ejecutar

  18. Los resultados mostrarán las 10 consultas SQL principales que tardan más tiempo en devolver información en su aplicación. Tenga en cuenta que la segunda entrada en nuestra captura de pantalla de ejemplo devuelve la misma consultar que identificamos anteriormente (SELECT TOP 2…).

    Los 10 mejores resultados

  19. Haga clic en el botón Nueva consulta de la barra de herramientas

  20. Ingrese la lógica de la declaración SQL que copió de la App Builder registros
  21. Seleccione la base de datos correspondiente en el menú de selección de Base de datos disponible

    SQLquery

  22. Si está utilizando una base de datos de SQL Server (SQL Express no es compatible con esta función), puede hacer clic con el botón derecho del mouse dentro del panel Consulta SQL y seleccionar Analizar consulta en el Asesor de optimización del motor de base de datos. Aquí también puede aprovechar la utilidad del plan de ejecución, que trazará el recorrido que realiza la instrucción SQL a través de la base de datos de la aplicación y ayudará a identificar áreas que pueden requerir mucho tiempo de optimización.

El ajuste de bases de datos es un conjunto de habilidades técnicas y complejas, requiere los permisos adecuados para acceder y ver las bases de datos, y debe realizarse de manera metódica, cuidadosa y con pruebas rigurosas durante todo el proceso para garantizar que el resultado neto sea positivo.

Recursos

  • Ajuste del rendimiento de consultas (SQL Server Compact): https://technet.microsoft.com/en-us/library/ms172984(v=sql.110).aspx.aspx)
  • SQL Server 2017 - "Vistas y funciones de administración dinámica relacionadas con el índice (Transact-SQL)" de Microsoft: https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/index-related-dynamic-management-views-and-functions-transact-sql?view=sql-server-2017