none
Querys que consuman recursos RRS feed

  • Pregunta

  • Hola.

    Estoy tratando testeat un servidor nuevo, pero no quiero suar aplicaciones de tercerros.

    Quisiera si me pueden ayudar con alguna query que haga mucho uso de CPU, es la que mas me interesa.

    Y de ser posible una query que consuma mucha RAM y otra que consuma bastante I/O

    La consulta de I/O estoy probando una query que haga muchos INSERT con un While, y luego hago el DELET respectivo para no hacer crecer tanto la BD, pero con una que consuma CPU y otra de RAM ando perdido.

    Nota: Es para un SQL 2012

    Gracias desde ya.

    domingo, 14 de junio de 2020 2:31

Todas las respuestas

  • Hola prtdb2:

    Una cosa que no le gusta a las CPU,s es la recursividad.

    create table dbo.arbolRecursivo
    ( id int primary key
    , descripcion varchar(100)
    , padre int
    )
    go
    truncate table dbo.arbolRecursivo
     declare @cont int=50000;
    
     while @cont > 0
     begin
    	Insert into dbo.arbolRecursivo(id, descripcion, padre)
    	Select @cont, CAST(@cont as varchar(100)), @cont/2;
    	set @cont-=1;
     end
     go
     update dbo.arbolRecursivo set padre = null where id = 1
     go

    Con la tabla creada y 50000 filas insertadas (aquí puedes apretarle todo lo que quieras)

    set statistics time, io on;
     WITH cte(ID, 
                     Descripcion)
          AS (SELECT F.ID, 
                     F.Descripcion
              FROM arbolRecursivo F
              WHERE F.PADRE IS NULL
              UNION ALL
              SELECT F.id, 
                     F.Descripcion
              FROM arbolRecursivo F
                   INNER JOIN cte c ON F.Padre = c.id)
          SELECT cte.ID, 
                 cte.Descripcion
          FROM cte 
     set statistics time, io off;   

    Cte recursivo

    https://javifer2.wordpress.com/2018/12/20/with-cte-tablas-de-expresion-comun-recursividad-3/


    domingo, 14 de junio de 2020 5:51
  • Estimado Javi, hice la prueba pero la CPU no subio del 20%, deberia ser un numero mayor a 5000 ?

    Si hubo un buen uso de CPU  time = 122648 ms

    lunes, 15 de junio de 2020 15:53
  • Yo de nuevo, la hice con 500.000 y la CPU queda en unos 23%

    Podría agregarle algo mas a la query para poder forzarla mas aun ?

    lunes, 15 de junio de 2020 16:16
  • Hola, existe una herramienta que sirve para ESTRESAR a tu servidor, habres tantas conexiones como gustes y por cada conexion, ejecutas el query de Javi, por periodos de tiempo recurrente.

    http://www.sqlstress.com/

    Tambien esta la herramienta de Microsoft que hace lo mismo

    https://www.microsoft.com/es-mx/p/sqlquerystress/9n46qj5sbgkb?activetab=pivot:overviewtab


    IIslas Master Consultant SQL Server


    lunes, 15 de junio de 2020 16:22
  • Estimado IISLAS.

    Gracias por la información, pero quisiera hacerlo con querys sin abrir tantas conexiones, una query que exija la CPU lo mas posible.

    lunes, 15 de junio de 2020 16:29
  • Hola ClaudioAlejandroP:

    En vez de 5000, pon 50 Millones. O la cantidad que te parezca. Esta query es algo simple y si observas en los recuentos que te he facilitado, todo es procesamiento.

    Si ves un poco la query, es más podrías hacer un árbol con mucha más profundidad, para someterle realmente a algo más duro.

    La query hace un arbol.

    Nodo, Nodo padre

    1, null

    2, 1

    3, 1

    4, 2

    Si observas el dibujo es un árbol de 1 nivel. Si le pones muchos niveles, entonces tiene que realizar mucho más procesamiento por cada nivel.

    lunes, 15 de junio de 2020 16:37
  • OK, averiguare como poner mas niveles, pues no entiendo mucho sobre los niveles del arbol.

    Saludos.

    lunes, 15 de junio de 2020 16:50
  • Hola ClaudioAlejandroP:

    Esto te ayudará un poco:

    drop table if exists dbo.arbolRecursivo;
    create table dbo.arbolRecursivo
    ( id int primary key
    , descripcion varchar(100)
    , padre int
    )
    go
    truncate table dbo.arbolRecursivo
     declare @cont int=50000;
    
     while @cont > 0
     begin
    	Insert into dbo.arbolRecursivo(id, descripcion, padre)
    	Select @cont, CAST(@cont as varchar(100)), @cont/2;
    	
    	insert into dbo.arbolRecursivo(id,descripcion,padre)
    	SElect @cont-1, cast(@cont as varchar(100)), @cont/3
    
    	insert into dbo.arbolRecursivo(id,descripcion,padre)
    	SElect @cont-2, cast(@cont as varchar(100)), @cont/4
    	set @cont-=3;
     end
     go
     update dbo.arbolRecursivo set padre = null where id = 1
     go

    Con algún nivel más, vamos a hacer una query un poco más compleja.

    set statistics time, io on;
     WITH cte(ID, Descripcion, level)
          AS (SELECT F.ID, 
                     F.Descripcion,
    				 0 as level
              FROM arbolRecursivo F
              WHERE F.PADRE IS NULL
              UNION ALL
              SELECT F.id, 
                     F.Descripcion,
    				 C.level +1
              FROM arbolRecursivo F
                   INNER JOIN cte c ON F.Padre = c.id),
    cte2 as (
          SELECT cte.ID, 
                 cte.Descripcion,
    			 cte.level
          FROM cte 
    	  ),
    	  cte3 as (
    	  select * from cte2 cross join sys.objects d)
    select * from cte3
    
     set statistics time, io off;   

    Si no es suficiente, le añadimos un nivel más.

    set statistics time, io on;
     WITH cte(ID, Descripcion, level)
          AS (SELECT F.ID, 
                     F.Descripcion,
    				 0 as level
              FROM arbolRecursivo F
              WHERE F.PADRE IS NULL
              UNION ALL
              SELECT F.id, 
                     F.Descripcion,
    				 C.level +1
              FROM arbolRecursivo F
                   INNER JOIN cte c ON F.Padre = c.id),
    cte2 as (
          SELECT cte.ID, 
                 cte.Descripcion,
    			 cte.level
          FROM cte 
    	  ),
    	  cte3 as (
    	  select * from cte2 cross join sys.objects d),
    	 cte4 as (
    	 select cte3.*, cast(e.object_id as nvarchar(max))as eid  from cte3 cross join sys.objects e)
    select * from cte4
    
     set statistics time, io off;   
    Eso ya debería de darte algo de juego

    lunes, 15 de junio de 2020 19:27
  • Hola prtdb2, 

      

    ¿Alguna novedad sobre la consulta realizada? ¿Han sido útiles las  respuestas proporcionadas?  

    Espero su respuesta.  

    Gracias por usar los foros de MSDN.  

    Andres Aguilar 

    ____________________________  

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.  

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.   

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft. 

    lunes, 15 de junio de 2020 19:45
    Moderador