Saltar al contenido

Depuración y Mejora del Rendimiento del Vinyl

Herramientas para Desarrolladores de Chrome

Chrome DevTools es un conjunto de herramientas desarrollador web integradas directamente en el navegador Google Chrome. Con DevTools de Chrome, puede diagnosticar problemas en Vinyl con solicitudes que no se responden o no se manejan correctamente, registrar un archivo HAR que se utiliza para solucionar problemas adicionales y ayudar 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 realizadas por la página mientras se carga para identificar áreas específicas que afectan el tiempo de carga de la página.

Nota

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

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 una solicitud de aplicación Vinyl 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 completó con éxito.

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

Pestaña Chromenetwork

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 Internal Server Error y 504 Gateway Timeout. La información contenida en la columna Nombre de este resultado ayuda a definir en qué parte de Vinyl se inicia este error.

Aquí hay una lista de los resultados de códigos de error HTTP más comunes:

  • 301 Movido Permanentemente
  • 302 encontrado
  • Redirección temporal 307
  • 308 Redirección permanente
  • 400 Solicitud incorrecta = Error del cliente
  • 401 No autorizado = Error del cliente
  • 403 Prohibido = Error del cliente
  • 404 no encontrado = error del cliente
  • Método 405 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

Generando un Archivo HAR con Chrome

Al solucionar problemas complejos de Vinyl, tener un archivo HAR grabado y generado a partir de las herramientas de Chrome Web Developer puede ser útil o puede ser solicitado por un desarrollador de Vinyl para solucionar más identificar y solucionar problemas. Un archivo HAR captura un registro de las solicitudes y la actividad de la red en el momento en que ocurre el problema en cuestión. Específicamente, un HAR es un formato de archivo con 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 página de Vinyl donde ocurre el problema.
  2. En la barra de menú de Chrome, seleccione Ver > Desarrollador > Herramientas de desarrollador
  3. Desde el panel abierto en la parte inferior de la pantalla, seleccione la pestaña Red
  4. Busque un botón Grabar rojo redondo en la esquina superior izquierda de la pestaña Red y asegúrese de que sea rojo. Si es gris, haz 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 cualquier registro existente en la pestaña Red.
  7. Ahora intente reproducir el problema que estaba experimentando antes, mientras se registran 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 "Comenzar a analizar el rendimiento de la red en Chrome DevTools" https://developers.google.com/web/tools/chrome-devtools/network-performance/

Identificar Problemas de Rendimiento con Chrome

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

Tenga en cuenta que si en los resultados de la pestaña Red encuentra que las solicitudes denominadas filtro? están ocupando la mayor parte del tiempo de carga de la página, esto indica que probablemente necesite optimizar el objeto de negocio correspondiente.

Los objetos de negocio (u objetos de datos) pueden ser una fuente de tiempos de carga de página lentos. Si identifica que una solicitud de ejecución más larga se origina en un objeto comercial, consulte la siguiente sección que describe los motivos por los cuales 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 Business Objects (también conocidos como Data Objects) pueden ser la causa de problemas de rendimiento o lentitud en la aplicación Vinyl. Los motivos específicos por los que un objeto de negocio podría ser lento incluyen:

  • La lógica SQL contiene muchas subconsultas.
  • Las columnas innecesarias se utilizan en lógica.
  • Cuando las cláusulas no utilizan declaraciones compatibles con el índice
  • Los índices no están definidos en las tablas que utiliza un objeto de datos.
  • Índices redundantes en tablas a las que hace referencia la lógica SQL
  • Unirse a columnas calculadas
  • El uso del índice puede perderse debido a la lógica que se ejecuta en las funciones.
  • El campo binario se incluye cuando el campo binario no está siendo utilizado por un Panel
    • Solo incluya campos binarios en Business Objects si se usa como control de archivo
    • Vale la pena crear Business Objects específicamente para usar en Paneles donde se carga/descarga un archivo
  • Vinyl cargará todas las columnas de un objeto comercial según las siguientes condiciones:
    • Existe formato condicional
    • Si un campo tiene habilitada la sustitución de soportes
    • Si un panel tiene reglas de visibilidad no estáticas

Los Business Objects aún pueden provocar tiempos de carga lentos en las páginas de aplicaciones, incluso si los 'Resultados' del Business Object resultantes 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 la interfaz de usuario que puedan causar tiempos de carga de la página más lentos.

Aplanar Consultas SQL

Si ha identificado que un objeto comercial específico está causando problemas de rendimiento, es posible que exista una oportunidad de mejorar la lógica SQL y potencialmente aplanar la consultar.

  • La mayoría de las veces deberías reutilizar las subconsultas.
  • A veces una consultar puede llegar a ser tan grande con subconsultas anidadas que se ejecuta lentamente; solo entonces se debe revisar y reescribir.
  • 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 de los que utiliza la consultar externa.
  • Eliminar estas columnas (particularmente las columnas que se calculan) mejorará el rendimiento
  • Utilice Copiar regla y comience a realizar cambios
  • Calcular el tiempo que tardan en aparecer los "Resultados". También calcule cuánto tiempo tardará en devolver "Cargar más filas".

Índice de Declaraciones Amistosas en Cláusulas Where

La cláusula Where define la condición de búsqueda de una declaración SQL y, por lo tanto, cae en el dominio funcional central de un índice: encontrar datos rápidamente. Una cláusula Where mal escrita suele ser la culpable de que una consultar SQL funcione lentamente. Una cláusula Dónde debe ser eficiente e incluir los índices correctos.

Malo (no se utilizarán índices):

  • Donde INFERIOR(Nombre) como '%Bob%
  • Donde AHORA() > FECHAADD(minutos,60,HoraInicio)

Bueno (índices utilizados):

  • Donde el nombre es como 'Bob%'
  • Donde AgregarFecha(minutos,-60,AHORA()) > HoraInicio

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

Configuraciones de Vinyl para Mejorar el Rendimiento

Esta sección ilustrará las configuraciones en Vinyl 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.

A 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, Vinyl genera consultas fáciles de indexar:

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

Índices y Qué Debería Indexarse

En SQL, se utiliza un índice para acelerar el rendimiento de las consultas al ayudar a recuperar los datos más rápidamente desde SQL Server. Esto se logra reduciendo la cantidad de páginas de datos de la base de datos que deben visitarse/escanearse. Cuando piensa en índices en Vinyl Data Objects, necesita índices suficientes para acelerar sus consultas SELECT y, al mismo tiempo, no debe crear índices redundantes que podrían ralentizar sus operaciones ACTUALIZAR/ELIMINAR.

Las arquitecturas de índice se clasifican en 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 del índice. Esta es la razón por la que solo puede existir un índice agrupado en una tabla determinada, mientras que pueden existir muchos índices no agrupados en la tabla.

En Vinyl, los índices se crean en los objetos de la 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 ralentizar 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 modificar índices en Vinyl, tenga en cuenta los siguientes puntos clave:

  • Desea equilibrar la creación de índices con el impacto en el rendimiento que se producirá en las declaraciones de inserción/actualización. Agregar índices acelerará las consultas, pero ralentizará la inserción/actualización/eliminación.
  • También debes considerar la indexación de las columnas que usas para ordenar y aquellas que usas en una expresión de agrupación. Podría beneficiarse de 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 columnas.
    • El orden de las columnas en el índice es importante
    • La recomendación es que las columnas de desigualdad vengan después de las columnas de igualdad en sus índices de cobertura.

Herramientas de Índice Faltantes

Existen consultas y utilidades 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 pueden usarse para monitorear el estado de su servidor de base de datos y diagnosticar problemas. Los DMV brindan una gran visión de lo que sucede dentro de SQL Server. Ejecutarlos requiere el permiso VER ESTADO DE BASE DE DATOS en la base de datos en cuestión.

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

  • Ejecución del Asesor de optimización del motor de base de datos
  • Ejecución de vistas de gestión dinámica de índices faltantes
  • SQL Server Engine muestra índices faltantes cuando genera 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 [Coste 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 una Declaración SQL de 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 de los registros de Vinyl y ejecutarla 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 agregarán, por ejemplo.

Para recuperar la lógica de la declaración SQL, navegue en la aplicación hasta la página donde se utiliza el objeto comercial. De 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 del registro de memoria, establezca Severidad mínima en Seguimiento.

    Importante

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

  6. Haga clic en el botón Guardar

  7. Ahora deberías estar viendo la pantalla Fast Logs en Vinyl, que consta de 500 líneas de datos de registro (a menos que modifiques ese valor de 500). Desplácese por los datos del 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, establezca Severidad mínima en Desactivado
  12. Inicie SQL Server Management Studio
  13. Conéctese a la conexión de su base de datos
  14. Hay algunas rutas diferentes que puede aprovechar en SQL Server Management Studio para, en última instancia, 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.):

    Seleccione 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 (SELECCIONE LOS 2 PRINCIPALES…).

    Top 10 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 los registros de Vinyl.
  21. Seleccione la base de datos correspondiente en el menú de selección de Base de datos disponible.

    Sqlquery

  22. Si está utilizando la base de datos SQL Server (SQL Express no lo admite), 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 declaración SQL a través de la base de datos de la aplicación y ayudará a identificar áreas que pueden requerir mucho tiempo para ajustarse.

El ajuste de la base 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 índices (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