CREATE PROCEDURE USP_RandomLoad AS
/*
Util : USP_RandomLoad
Purpose : Generate Random load on a server.
How? : Randomly selects 2 tables from current database
and multiply their results together.
It could easily generate no load if one of the tables
contains no rows.
Use : EXECUTE USP_RandomLoad
Place the procedure in a loop to execute multiple times
and purposely 'stress' a server.
*/
SET NOCOUNT ON
/* Declare Variables */
DECLARE @SQL VARCHAR(200)
DECLARE @TableCount INT
DECLARE @InnerTableNumber INT
DECLARE @InnerCounter INT
DECLARE @OuterTableNumber INT
DECLARE @OuterCounter INT
DECLARE @VarTable1Schema VARCHAR(200)
DECLARE @VarTable2Schema VARCHAR(200)
DECLARE @VarTable1Name VARCHAR(200)
DECLARE @VarTable2Name VARCHAR(200)
/* Get the total number of tables */
SELECT @TableCount = COUNT(*) FROM INFORMATION_SCHEMA.TABLES
/* Randomly select a outer table by table number */
SELECT @OuterTableNumber = ROUND(RAND() * @TableCount,0,1)
IF @OuterTableNumber = 0 SET @OuterTableNumber = 1
IF @OuterTableNumber > @TableCount SET @OuterTableNumber = @TableCount
SET @OuterCounter = 0
/* Declare a cursor and iterate through all the
tables in the current database in tablename order. */
DECLARE CURSORNAME CURSOR FOR
SELECT TABLE_SCHEMA,TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
SELECT * FROM INFORMATION_SCHEMA.TABLES ORDER BY TABLE_NAME
OPEN CURSORNAME
FETCH NEXT FROM CURSORNAME
INTO @VarTable1Schema, @VarTable1Name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @OuterCounter = @OuterCounter + 1
IF @OuterCounter = @OuterTableNumber
/* Random Table found */
BEGIN
SET @InnerCounter = 0
/* Randomly select a inner table by table number */
SELECT @InnerTableNumber = ROUND(RAND() * @TableCount,0,1)
IF @InnerTableNumber = 0 SET @InnerTableNumber = 1
IF @InnerTableNumber > @TableCount SET @InnerTableNumber = @TableCount
/* Inner cursor to loop through the tables until it gets
to the Nth one, i.e. the one that corresponds to the
random number created */
DECLARE INNERCURSORNAME CURSOR FOR
SELECT TABLE_SCHEMA,TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
SELECT * FROM INFORMATION_SCHEMA.TABLES ORDER BY TABLE_NAME
OPEN INNERCURSORNAME
FETCH NEXT FROM INNERCURSORNAME
INTO @VarTable2Schema, @VarTable2Name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @InnerCounter = @InnerCounter + 1
IF @InnerCounter = @InnerTableNumber
/* Random Table found */
BEGIN
/* Generate a random recordset by using CROSS APPLY to multiply the 2 tables.
The record set could be ANY size hence a totally random load is generated. */
SET @SQL = 'SELECT * FROM ['+@VarTable1Schema+'].['+@VarTable1Name+'] TABLE1 CROSS APPLY ['+@VarTable2Schema+'].['+@VarTable2Name+'] TABLE2 ORDER BY 2 DESC'
BEGIN TRANSACTION
--PRINT CAST(@OuterTableNumber AS VARCHAR(5))
--PRINT CAST(@InnerTableNumber AS VARCHAR(5))
PRINT (@SQL)
SET NOCOUNT OFF
EXEC (@SQL)
--RETURN
COMMIT TRANSACTION
END
FETCH NEXT FROM INNERCURSORNAME
INTO @VarTable2Schema, @VarTable2Name
END
CLOSE INNERCURSORNAME
DEALLOCATE INNERCURSORNAME
-- INNER CURSOR END
END
FETCH NEXT FROM CURSORNAME
INTO @VarTable1Schema, @VarTable1Name
END
CLOSE CURSORNAME
DEALLOCATE CURSORNAME
GO
Friday, 13 June 2008
USP_RandomLoad
Script to generate a random load by multiplying the results of 2 random tables! -
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment