subscribe by email and YouTube to get notification of new posts. & videos.

DB Tuning Pt1 SP etc

Hei, or hi, see below screen and the main Stored Procedure that the BOTs will check for. I hope you like it, or not.

as said, the SP

USE [superbots]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SERVERS.BOTS.INSTANCES.SelectOrCreateAndSelect] (
	  @Bot_Name NVarChar(8) =  N'WinForms'
	, @OS NVarChar(16), @OS_ID int = NULl
	, @Server_Serial nvarchar(64), @Server_MachineName NVarChar(32), @Server_Language NChar(2) = N'es'
	, @Server_PhysicalCores tinyInt, @Server_LogicalCores tinyint, @Server_PhysicalCoresMaxMhz tinyInt
	, @Server_ID int = NULL
	, @Settings_Bots_Instances_MaxMinsOfInactivity tinyInt = NULL
	, @Language nchar(2) = NULL, @Country nchar(4) = NULL

) 
AS
BEGIN
	SET NOCOUNT ON
	DECLARE @Bot_ID tinyINT;
	DECLARE @Bot_Instance_ID INT; 
	DECLARE @Server_MaxBotInstances TinyINT;
	SET @OS_ID = (SELECT TOP 1 [OS.ID] FROM dbo.[OS] AS O WHERE O.[OS] = @OS)
	IF EXISTS (
		SELECT * FROM
		dbo.[Servers] AS S WHERE S.[Server.MachineName] = @Server_MachineName
	)
		BEGIN
			SELECT TOP 1 @Server_ID = [Server.ID], @Server_MaxBotInstances = [Server.MaxBotInstances] FROM dbo.[Servers] AS S WHERE S.[Server.MachineName] = @Server_MachineName AND S.[Server.Active] = 1
		END
	ELSE
		BEGIN
			INSERT INTO dbo.[Servers] ([OS.ID], [Server.MachineName], [Server.Language],[Server.PhysicalCores], [Server.LogicalCores], [Server.PhysicalCoresMaxMhz] ) VALUES (@OS_ID, @Server_MachineName,@Server_Language,@Server_PhysicalCores,@Server_LogicalCores, @Server_PhysicalCoresMaxMhz )
			SET @Server_ID = (SELECT SCOPE_IDENTITY())
			SET @Server_MaxBotInstances = (SELECT [Server.MaxBotInstances]  FROM dbo.[SERVERS] AS S WHERE S.[Server.ID] = @Server_ID )
		END;
	
	-- Buscar instancia de de ultima fecha al menos 6 horas desde ahora que no tenga actividad
	SET @Settings_Bots_Instances_MaxMinsOfInactivity = (SELECT TOP 1 [Settings.Bots.Instances.MaxMinsOfInactivity] FROM dbo.[SETTINGS] AS STT WHERE STT.[Setting.IsDefault] = 1 ORDER BY STT.[Setting.ID] DESC)
	SET @Bot_ID = (SELECT [Bot.ID] FROM dbo.[BOTS] AS B WHERE B.[Bot.Name] = @Bot_Name )


	--VER SI EXISTE INSTANCIA O SE DEBE CREAR
	IF EXISTS(
		SELECT * FROM dbo.[SERVERS.BOTS.INSTANCES] AS SBI
		INNER JOIN dbo.[BOT.INSTANCES] AS BI ON BI.[Bot.Instance.ID] = SBI.[Bot.Instance.ID]
		INNER JOIN dbo.[BOTS] AS B ON B.[Bot.ID] = BI.[Bot.ID]
		INNER JOIN dbo.[SERVERS] AS S ON S.[Server.ID] = SBI.[Server.ID]
		WHERE B.[Bot.Physical] = 0 AND BI.[Bot.Instance.Active] = 1 AND B.[Bot.Name] = @Bot_Name 
		AND SBI.[Server.ID] = @Server_ID
		AND BI.[Bot.Instance.LastOperationDate] <  DATEADD(MINUTE,@Settings_Bots_Instances_MaxMinsOfInactivity,SYSDATETIME())

	)
		BEGIN
			SELECT @Bot_Instance_ID = BI.[Bot.Instance.ID]
			FROM dbo.[SERVERS.BOTS.INSTANCES] AS SBI
			INNER JOIN dbo.[BOT.INSTANCES] AS BI ON BI.[Bot.Instance.ID] = SBI.[Bot.Instance.ID]
			INNER JOIN dbo.[BOTS] AS B ON B.[Bot.ID] = BI.[Bot.ID]
			INNER JOIN dbo.[SERVERS] AS S ON S.[Server.ID] = SBI.[Server.ID]
			WHERE B.[Bot.Physical] = 0 AND BI.[Bot.Instance.Active] = 1 AND B.[Bot.Name] = @Bot_Name 
			AND SBI.[Server.ID] = @Server_ID
			AND BI.[Bot.Instance.LastOperationDate] <  DATEADD(MINUTE,@Settings_Bots_Instances_MaxMinsOfInactivity,SYSDATETIME())

		END
	ELSE
		BEGIN
		-- NO EXISTE NINGUNA INSTANCIA, DEBE CREARSE PUES, SIEMPRE Y CUANDO NO NOS SOBREPASEMOS DE INSTANCIAS POR SERVIDOR
			DECLARE @ActualInstances tinyINT = 0;
			--CHECKEAR QUE NO SE HAYA SOBREPASADO, O IGUALADO EL LIMITE DE MAX INSTANCIAS POR SERVER
			SELECT @ActualInstances = COUNT(*)
			FROM dbo.[SERVERS.BOTS.INSTANCES] AS SBI
			INNER JOIN dbo.[BOT.INSTANCES] AS BI ON BI.[Bot.Instance.ID] = SBI.[Bot.Instance.ID]
			INNER JOIN dbo.[BOTS] AS B ON B.[Bot.ID] = BI.[Bot.ID]
			INNER JOIN dbo.[SERVERS] AS S ON S.[Server.ID] = SBI.[Server.ID]
			WHERE B.[Bot.Physical] = 0 AND BI.[Bot.Instance.Active] = 1 AND B.[Bot.Name] = @Bot_Name 
			AND SBI.[Server.ID] = @Server_ID
			AND BI.[Bot.Instance.LastOperationDate] <  DATEADD(MINUTE,@Settings_Bots_Instances_MaxMinsOfInactivity,SYSDATETIME())

			IF @ActualInstances  >=  @Server_MaxBotInstances 
				BEGIN
					RETURN SELECT -4
				END
			ELSE
				BEGIN
					--CREAR INSTANCIA: BOTSINSTANCES, SERVER.BOT.INSTANCES
					INSERT INTO dbo.[BOTS.INSTANCES]
					([Bot.ID], [IP.ID] )
					VALUES
					(@Bot_ID, 
					
						(
							SELECT TOP 1 [IP.ID] FROM [IPS] AS I WHERE NOT I.[IP.ID]  IN (
								SELECT BI.[IP.ID] FROM dbo.[SERVERS.BOTS.INSTANCES] AS SBI
								INNER JOIN dbo.[BOT.INSTANCES] AS BI ON BI.[Bot.Instance.ID] = SBI.[Bot.Instance.ID]
								INNER JOIN dbo.[BOTS] AS B ON B.[Bot.ID] = BI.[Bot.ID]
								INNER JOIN dbo.[SERVERS] AS S ON S.[Server.ID] = SBI.[Server.ID]
								WHERE B.[Bot.Physical] = 0 AND BI.[Bot.Instance.Active] = 1 
								AND B.[Bot.Name] = @Bot_Name 
								AND SBI.[Server.ID] = @Server_ID
								AND BI.[Bot.Instance.LastOperationDate] <  DATEADD(MINUTE,@Settings_Bots_Instances_MaxMinsOfInactivity,SYSDATETIME())

							) AND I.[Country] = ISNULL(@Country, I.[Country]) 
							  AND LEFT(I.[Country],2) = ISNULL(@language, LEFT(I.[Country],2))
						
						)
					
					)

					SET @Bot_Instance_ID = (SELECT SCOPE_IDENTITY())

				
				END
		END

		IF NOT EXISTS (SELECT * FROM  dbo.[SERVERS.BOTS.INSTANCES] WHERE [Server.ID] = @Server_ID AND [Bot.Instance.ID] = @Bot_Instance_ID )
		BEGIN
			INSERT INTO  dbo.[SERVERS.BOTS.INSTANCES] ([Server.ID],  [Bot.Instance.ID] ) VALUES ( @Server_ID, @Bot_Instance_ID)
		END


		SELECT * FROM dbo.[SERVERS.BOTS.INSTANCES] AS SBI
		INNER JOIN dbo.[SERVERS] AS S ON S.[Server.ID] = SBI.[Server.ID]
		INNER JOIN dbo.[OS] AS O ON O.[OS.ID] = S.[OS.ID] 
			INNER JOIN dbo.[BOTS.INSTANCES] AS BI ON BI.[Bot.Instance.ID] = SBI.[Bot.Instance.ID] 
		INNER JOIN dbo.[IPS] AS I ON I.[IP.ID] = BI.[IP.ID] 
		INNER JOIN dbo.[BOTS] AS B ON B.[Bot.ID] = BI.[Bot.ID] 
		INNER JOIN dbo.[ACCOUNTS] AS A ON A.[Account.ID] = BI.[Account.ID]
		INNER JOIN dbo.[ACCOUNTS.KEYWORDS] AS AK ON AK.[Account.ID] = A.[Account.ID]
		
		WHERE SBI.[Bot.Instance.ID] = @Bot_Instance_ID AND S.[Server.ID] = @Server_ID AND S.[Server.Active] = 1 AND BI.[Bot.Instance.Active] = 1
		

		--PENDIENTE: COMO RELACIONAR UN ACCOUNT Y UNOS HUMANS, CON LA INSTANCIA DEL BOT ACTUAL ?
			-- PONER Account.Id en Bot.Instancias ? SI
				-- Y PARA ELLO HACER CUENTA ACCOUNTS (la actual devices.account renombrarla) y en vez de poner account id como property de devices o de server.bla bla, ponerla como propiedad de bot.instanes

		--una vez finalizado, pegar en doninam y luego testear y actualizar doninam si fuere el caso




END

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *