{"id":490,"date":"2017-12-27T09:45:20","date_gmt":"2017-12-27T09:45:20","guid":{"rendered":"https:\/\/sqldoubleg.live-website.com\/?p=490"},"modified":"2018-04-29T20:04:26","modified_gmt":"2018-04-29T19:04:26","slug":"getting-perfmon-data-into-sql-server-part-ii","status":"publish","type":"post","link":"https:\/\/www.sqldoubleg.com\/es\/2017\/12\/27\/getting-perfmon-data-into-sql-server-part-ii\/","title":{"rendered":"Insertando datos de rendimiento en SQL Server, Parte II"},"content":{"rendered":"<p>Esta semana retomaremos el tema de mi \u00faltima publicaci\u00f3n para terminar lo que empezamos y acabar de introducir nuestros datos de rendimientos en nuestro Servidor SQL.&nbsp;Esta semana retomaremos el tema de mi \u00faltima publicaci\u00f3n para terminar lo que empezamos y acabar de introducir nuestros datos de rendimientos en nuestro Servidor SQL.<\/p>\n<p>Hasta ahora, hemos visto c\u00f3mo recopilar datos de Perfmon y los diferentes formatos en los que podemos almacenar tanto en archivos como en SQL, pero sin poner realmente ning\u00fan dato en nuestro servidore SQL.<\/p>\n<p>Para poder insertar en SQL Server, tenemos una herramienta llamada <strong><em>relog.exe<\/em><\/strong> que har\u00e1 el trabajo sucio por nosotros con una configuraci\u00f3n m\u00ednima, as\u00ed que dejadme que os muestre c\u00f3mo hacerlo.<\/p>\n<p>&nbsp;<br \/>\n<strong>Antes de usar relog.exe, como creamos un DSN<\/strong><\/p>\n<p>Relog es una aplicaci\u00f3n y, como tal, tiene conectarse a un servidor SQL. En este caso, la forma de conectarse es mediante un controlador ODBC, por tanto, tenemos que crear un nuevo DSN en el ordenador en el que queremos ejecutar Relog.exe, que no necesariamente tiene que ser el mismo donde est\u00e1 instalado nuestro servidor SQL.<\/p>\n<p>Si hacemos clic en Inicio y comenzamos a escribir ODBC, se mostrar\u00e1n las 2 versiones disponibles en los sistemas operativos modernos que son de 32 bits y 64 bits, debemos elegir la versi\u00f3n de 64 bits para que funcione.<\/p>\n<p>Parece ser que relog.exe es una herramienta un poco antigua, as\u00ed que el \u00fanico controlador que realmente funciona es el m\u00e1s antiguo, pero da igual mientras funcione, as\u00ed que elegimos controlador SQL Server 10.00.xxx.<\/p>\n<p><a href=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/12\/08_01_Create_ODBC.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/12\/08_01_Create_ODBC.png\" alt=\"\" width=\"594\" height=\"421\" class=\"aligncenter size-full wp-image-480\" srcset=\"https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/08_01_Create_ODBC.png 594w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/08_01_Create_ODBC-300x213.png 300w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/08_01_Create_ODBC-150x106.png 150w\" sizes=\"(max-width: 594px) 100vw, 594px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Luego tenemos que configurar el nuevo DSN siguiendo el asistente, primero el nombre que usaremos m\u00e1s adelante al ejecutar relog.exe<\/p>\n<p><a href=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/12\/08_02_Create_ODBC.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/12\/08_02_Create_ODBC.png\" alt=\"\" width=\"594\" height=\"421\" class=\"aligncenter size-full wp-image-481\" srcset=\"https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/08_02_Create_ODBC.png 594w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/08_02_Create_ODBC-300x213.png 300w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/08_02_Create_ODBC-150x106.png 150w\" sizes=\"(max-width: 594px) 100vw, 594px\" \/><\/a><\/p>\n<p>Y despu\u00e9s la seguridad, no hay gran cosa que configurar aqu\u00ed.<\/p>\n<p><a href=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/12\/08_03_Create_ODBC.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/12\/08_03_Create_ODBC.png\" alt=\"\" width=\"594\" height=\"421\" class=\"aligncenter size-full wp-image-482\" srcset=\"https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/08_03_Create_ODBC.png 594w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/08_03_Create_ODBC-300x213.png 300w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/08_03_Create_ODBC-150x106.png 150w\" sizes=\"(max-width: 594px) 100vw, 594px\" \/><\/a><\/p>\n<p>Y luego seleccionar la base de datos donde volcar los datos, es preferible haber creado una base de datos y no dejar la que viene predeterminada [master].<\/p>\n<p><a href=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/12\/08_04_Create_ODBC.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/12\/08_04_Create_ODBC.png\" alt=\"\" width=\"594\" height=\"421\" class=\"aligncenter size-full wp-image-483\" srcset=\"https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/08_04_Create_ODBC.png 594w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/08_04_Create_ODBC-300x213.png 300w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/08_04_Create_ODBC-150x106.png 150w\" sizes=\"(max-width: 594px) 100vw, 594px\" \/><\/a><\/p>\n<p>Algunas otras configuraciones que no dejo las que hay por defecto.<\/p>\n<p><a href=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/12\/08_05_Create_ODBC.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/12\/08_05_Create_ODBC.png\" alt=\"\" width=\"594\" height=\"421\" class=\"aligncenter size-full wp-image-484\" srcset=\"https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/08_05_Create_ODBC.png 594w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/08_05_Create_ODBC-300x213.png 300w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/08_05_Create_ODBC-150x106.png 150w\" sizes=\"(max-width: 594px) 100vw, 594px\" \/><\/a><\/p>\n<p>Y finalmente probamos la conectividad, que obviamente tiene que funcionar.<\/p>\n<p><a href=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/12\/08_06_Create_ODBC.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/12\/08_06_Create_ODBC.png\" alt=\"\" width=\"594\" height=\"421\" class=\"aligncenter size-full wp-image-485\" srcset=\"https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/08_06_Create_ODBC.png 594w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/08_06_Create_ODBC-300x213.png 300w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/08_06_Create_ODBC-150x106.png 150w\" sizes=\"(max-width: 594px) 100vw, 594px\" \/><\/a><\/p>\n<p>&nbsp;<br \/>\nAhora ya estamos listos para ejecutar relog.exe e insertar todos esos contadores en nuestra base de datos.<\/p>\n<p>&nbsp;<br \/>\n<strong>Antes de usar relog.exe, como limitamos la cantidad de datos<\/strong><\/p>\n<p>Puede ocurrir que tengamos todo tipo de contadores (para ser honestos, acumulamos demasiados de datos), pero solo estamos interesados en un peque\u00f1o subconjunto, entonces \u00bfpara qu\u00e9 cargar todo en la base de datos si no lo necesitamos? Simple, no cargues todo si no lo necesitas.<\/p>\n<p>Los par\u00e1metros que podemos usar para limitar la cantidad de datos son:<\/p>\n<ul>\n<li><strong>-cf<\/strong>, para especificar solo ciertos contadores de su archivo. Para ello necesitamos crear un archivo y escribir all\u00ed un contador por l\u00ednea, podemos usar la plantilla XML para ver los contadores, y quitar las etiquetas XML<\/li>\n<li><strong>-t<\/strong>, tomar\u00e1 un contador por cada n\u00famero que coloque aqu\u00ed, as\u00ed que por ejemplo si tenemos 100 filas en el archivo y aqu\u00ed decimos 2, obtendremos 50 filas, si decmios 4, 25 filas y as\u00ed sucesivamente.<\/li>\n<li><strong>-b<\/strong> and <strong>-e<\/strong>, estos definir\u00e1n una ventana de tiempo para el contador, por lo que si solo necesitas datos de 1:53 a 2:17 a.m. cuando ha habido alg\u00fan problema, puedes hacer eso tambi\u00e9n.<\/li>\n<\/ul>\n<p>&nbsp;<br \/>\nUsando  mi plantilla XML, si solo quisiera ver los contadores de SQL, har\u00eda lo siguiente<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\"> \r\n\\MSSQL$MSSQL2016:Buffer Manager\\Page life expectancy\r\n\\MSSQL$MSSQL2016:Buffer Node(*)\\Page life expectancy\r\n\\MSSQL$MSSQL2016:General Statistics\\User Connections\r\n\\MSSQL$MSSQL2016:Memory Manager\\Memory Grants Pending\r\n\\MSSQL$MSSQL2016:SQL Statistics\\Batch Requests\/sec\r\n\\MSSQL$MSSQL2016:SQL Statistics\\SQL Compilations\/sec\r\n\\MSSQL$MSSQL2016:SQL Statistics\\SQL Re-Compilations\/sec\r\n<\/pre>\n<p>y luego especificamos la ruta de este archivo al ejecutar relog; de lo contrario, se incluir\u00e1n todos los contadores.<br \/>\n&nbsp;<br \/>\n<strong>Qu\u00e9 pasa si no quiero usar relog.exe<\/strong><\/p>\n<p>Ok, yo ya he dicho que no lo har\u00eda, pero si quereis insertar los datos perfmon directamente en SQL, se puede configurar el recopilador de datos para hacerlo directamente.<\/p>\n<p>Solo necesitamos ir a las propiedades del recopilador de datos y elegir SQL como Formato de salida, luego eligimos el DSN que acabamos de crear en el cuadro.<\/p>\n<p>As\u00ed todos los datos se insertar\u00e1n en SQL.<\/p>\n<p><a href=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/12\/12_DataCollector_log_to_SQL_database.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/12\/12_DataCollector_log_to_SQL_database.png\" alt=\"\" width=\"400\" height=\"455\" class=\"aligncenter size-full wp-image-492\" srcset=\"https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/12_DataCollector_log_to_SQL_database.png 400w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/12_DataCollector_log_to_SQL_database-264x300.png 264w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/12_DataCollector_log_to_SQL_database-132x150.png 132w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<p>&nbsp;<br \/>\n<strong>Ejecutando relog.exe<\/strong><\/p>\n<p>No es muy complicado y ya he explicado algunos par\u00e1metros que podemos usar, pero se puede consultar la documentaci\u00f3n <a href=\"https:\/\/technet.microsoft.com\/en-gb\/library\/bb490958.aspx?f=255&#038;MSPPError=-2147217396\" rel=\"noopener\" target=\"_blank\">aqu\u00ed<\/a> para obtener la referencia completa. <\/p>\n<p>Obviamente, debemos especificar el archivo a procesar y, en nuestro caso, la configuraci\u00f3n de la base de datos para que funcione.<\/p>\n<ul>\n<li><strong>-f<\/strong>, especifica el formato de salida, SQL<\/li>\n<li><strong>-o<\/strong>, especifica la ruta del archivo de salida, en nuestro caso, el formato es <strong><em>SQL:nombre_DNS!SQLServerName<\/em><\/strong>.<br \/>\nEn mi ejemplo, ser\u00eda SQL:relog!Localhost\\MSSQL2016, pero para ser honesto en lugar del nombre del servidor podeis poner lo que querais, porque el nombre del servidor ya est\u00e1 especificado en el DSN <\/li>\n<\/ul>\n<p>&nbsp;<br \/>\nY con esto ya est\u00e1 listo.<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\"> \r\nC:\\WINDOWS\\system32&gt;relog &quot;C:\\PerfLogs\\Admin\\DBA_Collector\\SQLDOUBLEG_20171221-000348\\SQLDOUBLEG_DBA_DataCollector20171221_104025.blg&quot; -cf &quot;C:\\PerfLogs\\template_counters.txt&quot; -f SQL -o SQL:relog!localhost\\MSSQL2016\r\n<\/pre>\n<p>Despu\u00e9s de ejecutar esto, deberiamos ver algo como esto<\/p>\n<p><a href=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/12\/09_CMD_relog_command.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/12\/09_CMD_relog_command.png\" alt=\"\" width=\"1790\" height=\"512\" class=\"aligncenter size-full wp-image-486\" srcset=\"https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/09_CMD_relog_command.png 1790w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/09_CMD_relog_command-300x86.png 300w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/09_CMD_relog_command-768x220.png 768w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/09_CMD_relog_command-1024x293.png 1024w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/09_CMD_relog_command-150x43.png 150w\" sizes=\"(max-width: 1790px) 100vw, 1790px\" \/><\/a><\/p>\n<p>Si ves alg\u00fan tipo de error relacionado con SQL como <strong <em>\u00abA SQL failure occurred. Check the application event log for any errors.\u00bb<\/Em><\/strong> comprobad que el DSN se cre\u00f3 como expliqu\u00e9 anteriormente.<\/p>\n<p>&nbsp;<br \/>\n<strong>Datos de Perfmon en SQL Server<\/strong><\/p>\n<p>Despu\u00e9s de ejecutar con \u00e9xito relog.exe con SQL como destino, deber\u00edamos tener las nuevas tablas en la base de datos que hemos especificado en nuestro DSN.<\/p>\n<p><a href=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/12\/10_Perfmon_log_database.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/12\/10_Perfmon_log_database.png\" alt=\"\" width=\"247\" height=\"291\" class=\"aligncenter size-full wp-image-487\" srcset=\"https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/10_Perfmon_log_database.png 247w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/10_Perfmon_log_database-127x150.png 127w\" sizes=\"(max-width: 247px) 100vw, 247px\" \/><\/a><\/p>\n<p>Los datos se distribuyen de la siguiente manera<\/p>\n<ul>\n<li><strong>CounterData<\/strong>, estos son los valores para los diferentes contadores <\/li>\n<li><strong>CounterDetails<\/strong>, los diferentes contadores incluidos en el archivo de registro que hemos cargado <\/li>\n<li><strong>DisplayToID<\/strong>, las diferentes m\u00e1quinas[s] de las que hemos cargado informaci\u00f3n<\/li>\n<\/ul>\n<p>&nbsp;<br \/>\n<strong>El Truco<\/strong><\/p>\n<p>Y finalmente, despu\u00e9s de todo esto, aqu\u00ed estamos, ya tenemos los datos cargados en SQL Server y queremos mostrarlos.<\/p>\n<p>En mi opini\u00f3n, la mejor manera de visualizar estos datos es de la misma manera que podemos hacerlo en Excel, es decir, mostrar un contador por cada columna para que los diferentes valores para un punto dado en el tiempo est\u00e9n en la misma fila, pero esa no es la forma en que los datos se almacenan en [CounterData] por lo que tenemos que procesar los datos y (redoble de tambores) usar Pivot \ud83d\ude41<\/p>\n<p>Parece que cada truco que publico involucra los tipos de consultas que m\u00e1s odio escribir, ya sea XML o PIVOT, y la verdad que tiene sentido, porque lo que quiero es ahorrarte el dolor de escribir estas consultas.<\/p>\n<p>De modo que tengo que lograr que sean lo m\u00e1s flexibles que se pueda, luego siempre podeis modificarlos si quereis, claro.<\/p>\n<p>Debido a que no s\u00e9 qu\u00e9 contadores estar\u00e1n presentes en estas tablas o incluso qu\u00e9 nombres tienen (recordad que los contadores de SQL dependen del nombre de la instancia o en contadores del sistemao operativo, como el procesador que est\u00e1 relacionado con el numero de nucleos-hilos), necesitamos obtener din\u00e1micamente los valores (contadores) para luego usar PIVOT y transformarlos en las diferentes columnas.<\/p>\n<p>Aunque ya he mostrado c\u00f3mo filtrar los archivos al insertarlos en SQL, he a\u00f1adido un par\u00e1metro para filtrarlos nuevamente de las tablas, para darle m\u00e1s flexibilidad.<\/p>\n<pre class=\"brush: tsql; title: ; notranslate\" title=\"\">\r\n\r\nUSE [master];\r\nGO\r\nIF OBJECT_ID('dbo.sqlg_parseRelogOutput') IS NULL EXECUTE sp_executesql N'CREATE PROCEDURE dbo.sqlg_parseRelogOutput AS RETURN';\r\nGO\r\nSET ANSI_NULLS ON;\r\nGO\r\nSET QUOTED_IDENTIFIER ON;\r\nGO\r\n-- =============================================\r\n-- Author:\t\tRaul Gonzalez @SQLDoubleG\r\n-- Create date: 18\/12\/2017\r\n-- Description: Formats the output generated by relog.exe and exists in the following tables.\r\n--\t\t\t\t\t- CounterData\r\n--\t\t\t\t\t- CounterDetails\r\n--\t\t\t\t\t- DisplayToID\r\n-- \r\n-- Parameters:\r\n--\t\t\t\t@dbname -&gt; Name of the database where the Perfmon data exist\r\n--\t\t\t\t@CounterFilter -&gt; To select only the counters that match the filter\r\n--\r\n-- Usage:\t\tCall this stored proc and provide the name of the database where your perfmon logs have been loaded\r\n--\t\t\t\tIt is recommended not to run in the same server we are trying to analyze due to the \r\n--\t\t\t\t\tamount of resources used by this query\r\n--\r\n--\t\t\t\tEXECUTE master.[dbo].[sqlg_parseRelogOutput] N'Perfmon_logs', N'Processor';\r\n--\r\n-- Assumptions:\tYou have loaded perfmon information using relog as explained in \r\n--\t\t\t\t\thttps:\/\/sqldoubleg.live-website.com\/2017\/12\/20\/getting-perfmon-data-into-sql-server\/\r\n--\r\n-- Change Log:\t18\/12\/2017\tRAG\tCreated\r\n--\r\n-- Copyright:   (C) 2017 Raul Gonzalez (@SQLDoubleG https:\/\/sqldoubleg.live-website.com)\r\n--\r\n--              THIS CODE AND INFORMATION ARE PROVIDED &quot;AS IS&quot; WITHOUT WARRANTY OF \r\n--              ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED \r\n--              TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\/OR FITNESS FOR A\r\n--              PARTICULAR PURPOSE.\r\n--\r\n--              THE AUTHOR SHALL NOT BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY INDIRECT, \r\n--              SPECIAL, INCIDENTAL, PUNITIVE, COVER, OR CONSEQUENTIAL DAMAGES OF ANY KIND\r\n--\r\n--              YOU MAY ALTER THIS CODE FOR YOUR OWN *NON-COMMERCIAL* PURPOSES. YOU MAY\r\n--              REPUBLISH ALTERED CODE AS LONG AS YOU INCLUDE THIS COPYRIGHT AND GIVE DUE CREDIT. \r\n--\r\n-- =============================================\r\nALTER PROCEDURE [dbo].[sqlg_parseRelogOutput]\r\n\t@dbname sysname\r\n\t, @CounterFilter NVARCHAR(256) = NULL\r\nAS\r\nBEGIN\r\n\t\r\n\tDECLARE @column_list\tNVARCHAR(MAX);\r\n\tDECLARE @pivot_list\t\tNVARCHAR(MAX);\r\n\tDECLARE @SQL\t\t\tNVARCHAR(MAX);\r\n\tDECLARE @RC\t\t\t\tINT;\r\n\t\r\n\tIF DB_ID(@dbname) IS NULL BEGIN\r\n\t\tRAISERROR (N'The database provided does not exist', 16, 1, 1);\r\n\t\tRETURN -100;\r\n\tEND;\r\n\r\n\t-- Get the different perfmon counters to be new columns for the output\r\n\tSET @SQL = N'USE ' + QUOTENAME(@dbname) + N'\t\r\n\t\t\r\n\t\tIF OBJECT_ID(''dbo.CounterData'') IS NULL OR OBJECT_ID(''dbo.CounterDetails'') IS NULL BEGIN\r\n\t\t\tRAISERROR (N''The Relog generated tables are not present on this database, please ensure that [dbo].[CounterData], [dbo].[CounterDetails] and [dbo].[DisplayToID] exist'', 16, 1, 1)\t\t\t\r\n\t\t\tRETURN\r\n\t\tEND\t\r\n\t\t\r\n\t\tSET @column_list = (SELECT DISTINCT N'', '' + QUOTENAME(CONCAT([ObjectName], CHAR(92), [CounterName], NULLIF(CONCAT(N'' ('', InstanceName, N'')''),N'' ()'' ))) AS [text()] \r\n\t\t\t\t\tFROM [dbo].[CounterDetails] \r\n\t\t\t\t\tWHERE [CounterName] LIKE CONCAT(N''%'', @CounterFilter + N''%'')\r\n\t\t\t\t\tFOR XML PATH(''''))\r\n\r\n\t\tSET @pivot_list = \t(STUFF(@column_list, 1, 2, ''''))';\r\n\r\n\tEXECUTE @RC = sys.sp_executesql \r\n\t\t\t@stmt = @SQL\r\n\t\t\t, @params = N'@column_list NVARCHAR(MAX) OUTPUT,@pivot_list NVARCHAR(MAX) OUTPUT, @CounterFilter NVARCHAR(256)'\r\n\t\t\t, @column_list = @column_list OUTPUT\r\n\t\t\t, @pivot_list = @pivot_list OUTPUT\r\n\t\t\t, @CounterFilter = @CounterFilter;\r\n\r\n\tIF @RC &lt;&gt; 0 BEGIN\r\n\t\tRETURN @RC;\r\n\tEND;\r\n\r\n\t-- Now generate the the query with the right values to PIVOT and get the data out \r\n\tSET @SQL = N'USE ' + QUOTENAME(@dbname) + N'\t\r\n\t\r\n\tSELECT  [ComputerName]\r\n\t\t\t, [CounterDateTime]\r\n\t\t\t' + @column_list + N'\r\n\t\tFROM (\r\n\t\t\tSELECT CONCAT(det.[ObjectName], CHAR(92), det.[CounterName], NULLIF(CONCAT('' ('', det.InstanceName, '')''),'' ()'' )) AS PermonCounter\r\n\t\t\t\t\t,did.[DisplayString] AS [ComputerName]\r\n\t\t\t\t\t,dat.[CounterDateTime] AS [CounterDateTime]\r\n\t\t\t\t\t,dat.[CounterValue]\r\n\t\t\t\tFROM [dbo].[CounterData] AS dat\r\n\t\t\t\t\tLEFT JOIN [dbo].[CounterDetails] AS det\r\n\t\t\t\t\t\tON det.CounterID = dat.CounterID\r\n\t\t\t\t\tLEFT JOIN [dbo].[DisplayToID] AS did\r\n\t\t\t\t\t\tON did.[GUID] = dat.[GUID]\r\n\t\t\t\tWHERE det.[CounterName] LIKE CONCAT(N''%'', @CounterFilter + N''%'')\r\n\t\t\t) AS s\r\n\t\tPIVOT(\r\n\t\t\tSUM([CounterValue])\r\n\t\tFOR [PermonCounter] IN (' + @pivot_list + '\t)) AS pvt\r\n\tORDER BY [CounterDateTime] ASC';\r\n\r\n\tEXECUTE @RC = sys.sp_executesql \r\n\t\t\t@stmt = @SQL\r\n\t\t\t, @params = N'@CounterFilter NVARCHAR(256)'\r\n\t\t\t, @CounterFilter = @CounterFilter;\r\n\r\n\tIF @RC &lt;&gt; 0 BEGIN\r\n\t\tRETURN @RC;\r\n\tEND;\r\n\r\nEND;\r\nGO\r\n\r\nEXECUTE master.[dbo].[sqlg_parseRelogOutput] N'Perfmon_logs', N'Processor';\r\n<\/pre>\n<p>&nbsp;<br \/>\nSi ejecutamos el ejemplo propuesto, la salida ser\u00eda algo como esto.<\/p>\n<p><a href=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/12\/11_sp_results.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2017\/12\/11_sp_results.png\" alt=\"\" width=\"1337\" height=\"350\" class=\"aligncenter size-full wp-image-491\" srcset=\"https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/11_sp_results.png 1337w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/11_sp_results-300x79.png 300w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/11_sp_results-768x201.png 768w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/11_sp_results-1024x268.png 1024w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2017\/12\/11_sp_results-150x39.png 150w\" sizes=\"(max-width: 1337px) 100vw, 1337px\" \/><\/a><\/p>\n<p>&nbsp;<br \/>\n<strong>Conclusi\u00f3n<\/strong><\/p>\n<p>Como ya dije en la primera parte de esta publicaci\u00f3n, es importante tener una idea de c\u00f3mo se ven nuestros servidores SQL en un estado normal, como de ocupados est\u00e1n y como rinden, en caso de que pase algo y todos empiezen a buscar cumplables. Y creedme, el primer lugar al que todos apuntan es a la base de datos, independientemente de si es la culpable o no.<\/p>\n<p>Espero que os haya dado algunas ideas de como comenzar a recopilar datos de rendimiento y ayudaror a visualizar cu\u00e1ndo los dedos comienzan a se\u00f1alar.<\/p>\n<p>Gracias por leer y, como siempre, cualquier comentario o pregunta es bienvenido.<\/p>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>Esta semana retomaremos el tema de mi \u00faltima publicaci\u00f3n para terminar lo que empezamos y acabar de introducir nuestros datos de rendimientos en nuestro Servidor SQL.&nbsp;Esta semana retomaremos el tema de mi&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,19],"tags":[82,58,83,84],"_links":{"self":[{"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/posts\/490"}],"collection":[{"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/comments?post=490"}],"version-history":[{"count":0,"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/posts\/490\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/media?parent=490"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/categories?post=490"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/tags?post=490"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}