Usuario
Querys que consuman recursos

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.
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/
- Propuesto como respuesta Andres Aguilar MModerator lunes, 15 de junio de 2020 19:45
-
-
-
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
- Editado iislas (MCP MCTS MPN DWA SQL Server) lunes, 15 de junio de 2020 16:24
-
-
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.
-
-
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
- Propuesto como respuesta Andres Aguilar MModerator lunes, 15 de junio de 2020 19:45
-
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.