2010-04-27 13 views
5

En relación con el rendimiento de SQL.Cómo debo usar BIT en SQL Server 2005

Tengo una función de valor escalar para verificar alguna condición específica en la base, devuelve el valor BIT para verdadero o falso.

ahora no saben cómo debo llenar parámetro @BIT

Si escribo.

set @bit = convert(bit,1) 

o

set @bit = 1 

o

función
set @bit='true' 

funcionará de todos modos, pero no sé qué método se recomienda para el uso diario.

Otra pregunta, tengo una tabla en mi base con alrededor de 4 millones de registros, la inserción diaria es de unos 4K registros en esa tabla.

Ahora quiero añadir restricción sobre la mesa con la función de un valor escalar que ya he mencionado

Algo como esto

ALTER TABLE fin_stavke 
ADD CONSTRAINT fin_stavke_knjizenje CHECK (dbo.fn_ado_chk_fin(id)=convert(bit,1)) 

donde "id" es la clave primaria de fin_stavke mesa y dbo.fn_ado_chk_fin parece

create FUNCTION fn_ado_chk_fin 
(
    @stavka_id int 
) 
RETURNS bit 
AS 
BEGIN 
declare @bit bit 

if exists (select * from fin_stavke where [email protected]_id and doc_id is null and protocol_id is null) 
     begin 
      set @bit=0 


     end 
    else 
     begin 
      set @bit=1 
     end 
return @bit; 
END 
GO 

Will este tipo y método de comprobación de restricciones afectarán gravemente el rendimiento en mi mesa y SQL en absoluto?

Si también hay una mejor manera de agregar control en esta tabla, por favor hágamelo saber.

+0

Un bit se asigna como 0 o 1, por lo que si declara @bit como Bit, entonces debe usar set @bit = 1 o set @bit = 0, habría pensado. – Lazarus

+0

A MSSQL no le importa la forma en que lo configure. puede establecerlo en 'verdadero, luego compararlo con 1 y SQL no le importará. – DForck42

Respuesta

4

Podría estar equivocado, pero por lo que parece, solo quiere comprobar que ni doc_id ni protocol_id son NULL?

Puede agregar una restricción de tabla para lograr esto.

ALTER TABLE fin_stavke 
ADD CONSTRAINT fin_stavke_knjizenje CHECK (doc_id IS NOT NULL OR protocol_id IS NOT NULL) 
+0

Tiene toda la razón – adopilot

+0

+1, lo que estaba pensando, pero solo si fin_stavke.id es único, lo que parece una suposición razonable en este caso –

+1

@adopilot: imprimió y enmarcó su comentario. Será útil la próxima vez que tenga una discusión con mi esposa. –

1

Siempre he visto bit usado como 1 o 0. Me quedaría con eso. Todos sabrán lo que estás haciendo.

Esa restricción va a afectar el rendimiento de sus inserciones, pero no por mucho, ya que debe buscar la clave principal de la tabla. Es probablemente la búsqueda más barata que puedes hacer.

2

que haría uso de

set @bit = 1 

Es seguro (asignando cierto que un poco se siente mal) y convertir simplemente parece no tener sentido.

1

un poco variable se puede configurar con un valor entero:

set @bit = 1 

veces quieres un valor de bits real para evitar la conversión implícita, entonces puede hacer una conversión excplicit:

set @bit = cast(1 as bit) 

Al asignarlo a una variable no existe una diferencia práctica, pero en una consulta la conversión ocurriría cuando la consulta se analiza en lugar de cuando se ejecuta. Lo he usado varias veces y tengo diferencias reales de rendimiento.

Cuestiones relacionadas