Hoy les quiero hablar acerca de un operador llamado "Computer Scalar", presente en nuestros planes de ejecución frecuentemente.
Como su nombre lo sugiere el operador indica la presencia de un cómputo escalar que devuelve un valor. También podemos hallar este operador dentro de nuestro plan de ejecución cuando realizamos conversiones explícitas o implícitas dentro de nuestas queries.
Normalmente ignoramos al "Compute Scalar" ya que no representa un costo grande dentro del contexto de nuestro plan de ejecución mas debemos tratar de tomar las medidas necesarias para evitarlo cuando realizamos operaciones de conversión o cálculos dentro de cursores grandes o de loops de dimensiones considerables Por qué? Porque pueden generar grandes cargas en nuestro server a nivel cpu, derivando esto en problemas de performance.
Les dejo pues un ejemplo de una operación que genera un "Computer Scalar" y abajo el cómo evitar el operador obteniendo grandes ganacias de performance con el mismo resultado final.
1) Operación que genera Computer Scalar:
DECLARE @Count Int
SET @Count = 0
WHILE @Count < 100000000
BEGIN
IF EXISTS(SELECT Idcdr FROM
Tabla WHERE Idcdr =
@I)
Begin
--Accion
End
SET @Count = @Count + 1;
END
2) Evitando el Computer Scalar con el uso del @@ROWCOUNT en lugar del Exists
DECLARE @Count Int
SET @Count = 0
WHILE @Count < 1000000
BEGIN
SELECT Idcdr FROM
Tabla WHERE Id =
@I
IF @@ROWCOUNT > 0
BEGIN
-- Accion
END
SET @Count = @Count + 1;
END
Amigos "de yapa" y para que entiendan lo importante que es definir una variable corréctamente les dejo un ejemplo más que genera un Compute Scalar por "conversión implícita" y la solución como paso 2 del ejemplo:
1) Buscando el Máximo Idcdr (campo integer) dentro de una tabla produciendo un Compute Scalar por mala definición de la variable @idini defnida como numeric (18,0) (cuando el campo idcdr de la tabla cdr_subscriptions es integer)
-- Declaro variables --
Declare @idini numeric
-- Determino el
Idcr maximo de la Tabla -
Select @idini = coalesce (max(idcdr),0)
from cdr_subscriptions with (nolock)
** La mala definición de la variable genera una conversión implícita de numeric a integer lo que a su vez produce un "Compute Scalar"
2) Buscando el Máximo Idcdr (campo integer) dentro de una tabla eliminando el Compute Scalar definiendo corréctamente la variable @idini -esta vez como integer-
-- Declaro variables --
Declare @idini integer
-- Determino el Idcr maximo de la Tabla -
Select @idini = coalesce (max(idcdr),0)
from cdr_subscriptions with (nolock)
Amigos, espero que lo expuesto haya sido de vuestra utilidad, les dejo mi saludo y como siempre estoy a vuestra disposición.
Gustavo Herrera.