Ocultar selección de salida de T-SQL


13

Estoy tratando de obtener el tiempo de ejecución de la consulta, pero también quiero ocultar el resultado de la consulta. Solo quiero el tiempo transcurrido, sin salida.

Ejemplo

DECLARE @Start datetime
DECLARE @End datetime

SELECT @StartTimeWA=GETDATE() 

SELECT 
       [id] 
      ,[database_id]
      ,[proc_name]
      ,[exec_t] from
  [DB].[dbo].[STAT] 

SELECT @End=GETDATE()

SELECT DATEDIFF(MS,@Start,@End) AS [Duration]

Por el momento, obtengo resultados de consultas y en la parte inferior mi duración, que es lo único que quiero en lo que respecta a la salida. No he podido hacer esto y me pregunto si alguien más se ha encontrado con problemas similares. Esto es algo que quiero hacer en T-SQL, no Management Studio ni nada de eso.

Estoy tratando de controlar el tiempo que lleva ejecutar la instrucción select e informar a un servidor. Tengo un servidor de monitor externo que lo ejecutará cada minuto y recuperará el tiempo (duración que tomó) que usaré con el tiempo para la tendencia / línea de base. A medida que la consulta actual escupe los resultados seleccionados y mi duración, la distorsiona, y mi servidor de monitoreo se confunde. Solo quería la columna de duración. También haré esto para inserciones, lo que será sencillo ya que no necesitará realizar una selección.

Estoy tratando de hacer esto puramente en T-SQL . No quiero usar DMV, ya que quiero obtener el tiempo que toma (instantánea) cuando ejecuto una consulta y verificar si esto cambia con el tiempo cuando el servidor pasa por los diversos niveles de carga, ya que esto me dará una buena idea en cuanto a si el tiempo de ejecución de la consulta cambia.

Respuestas:


28

Hay muchas formas diferentes de hacer esto.

Por lo general, no recomiendo insertar en una #temptabla, ya que cualquier carga tempdb o crecimiento automático puede afectar los resultados, y definitivamente no recomiendo usar una @tablevariable, ya que las modificaciones a estas son forzadas en serie (no se puede usar un plan paralelo), que puede cambiar los tiempos de consulta reales.

Asignación Variable

Puede declarar una variable y asignarle sus columnas, así:

DECLARE @Start datetime
DECLARE @End datetime
DECLARE @blob_eater SQL_VARIANT;

SELECT @StartTimeWA=GETDATE() 

SELECT 
       @blob_eater = [id] 
      ,@blob_eater = [database_id]
      ,@blob_eater = [proc_name]
      ,@blob_eater = [exec_t] from
  [DB].[dbo].[STAT] 

SELECT @End=GETDATE()

SELECT DATEDIFF(MS,@Start,@End) AS [Duration]

Aunque hacer esto puede evitar algunas optimizaciones de incrustación de parámetros. Consulte Parámetros de inhalación, incrustación y RECOMPILAR en "Una restricción de incrustación".

Tenga en cuenta que este método puede activar advertencias del plan sobre conversiones implícitas, pero no son del tipo del que deba preocuparse. Consulte estas preguntas y respuestas para obtener más información: lo que desencadena esta advertencia: la conversión de tipos en la expresión puede afectar la "estimación de cardinalidad" en la elección del plan de consulta .

En SSMS

Puede cambiar la configuración para descartar los resultados de la consulta.

NUECES

Estrés de consulta SQL

SQL Query Stress es una herramienta de código abierto que le permite ejecutar consultas en un servidor SQL para simular la carga. No se devuelven resultados de consulta a la aplicación cuando se ejecutan.

Puedes leer algunas instrucciones aquí .

ostress (Utilidades RML)

ostress es una herramienta similar, publicada por Microsoft, que tampoco devuelve resultados al cliente, a menos que elija hacerlo.

He escrito algo al respecto aquí .

Plan Explorer

El Explorador de planes de SentryOne es una alternativa gratuita para ver los planes de ejecución y puntos muertos de SQL Server.

También puede usarlo como cliente para consultar SQL Serve en algún grado:

NUECES

Esto también descartará los resultados.

NUECES

¡Espero que esto ayude!


0

Puede ejecutar su consulta SET STATISTICS TIME ONy capturar el mensaje de salida utilizando su aplicación de monitoreo en su servidor de monitoreo externo.

Una forma de capturar el mensaje de salida con .Net se explica en esta respuesta de Stack Overflow de AdaTheDev :

Puede hacerlo agregando un controlador de eventos al evento InfoMessage en la conexión.

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

void myConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    myStringBuilderDefinedAsClassVariable.AppendLine(e.Message);
}

0

¿No podría simplemente usar la selección inicial para devolver su @End?

SELECCIONE @blob_eater = [id], @ blob_eater = [database_id], @ blob_eater = [proc_name], @ blob_eater = [exec_t] de [DB]. [Dbo]. [STAT]

SELECT @ End = GETDATE ()

Se convierte

SELECT @ End = GETDATE () FROM [DB]. [Dbo]. [STAT]

Solo el último valor se almacenaría en la variable.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.