2010-04-27 20 views
5

Riguardo alle prestazioni SQL.Come utilizzare BIT in SQL Server 2005

Ho una funzione di valutazione scalare per il controllo di alcune condizioni specifiche in base, restituisce il valore BIT per Vero o Falso.

io ora non so come devo compilare parametro @BIT

Se scrivo.

set @bit = convert(bit,1) 

o

set @bit = 1 

o

funzione
set @bit='true' 

funzionerà comunque, ma non so quale metodo è raccomandato per l'uso quotidiano.

Un'altra domanda, ho un tavolo nella mia base con circa 4 milioni di record, l'inserimento giornaliero riguarda circa i record 4K in quella tabella.

Ora voglio aggiungere vincolo su quel tavolo con funzione con valori scalari che ho già detto

Qualcosa di simile

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

dove "id" è la chiave primaria della tabella fin_stavke e dbo.fn_ado_chk_fin assomiglia a

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 

Questo tipo e questo metodo di controllo del vincolo influenzeranno negativamente le prestazioni sul mio tavolo e SQL?

Se c'è anche modo migliore per aggiungere il controllo su questo tavolo, fatemelo sapere.

+0

Un bit è assegnato come 0 o 1, quindi se dichiari @bit come Bit, dovresti usare set @bit = 1 o impostare @bit = 0 avrei pensato. – Lazarus

+0

MSSQL non si cura del modo in cui lo si imposta. puoi impostarlo su "true", quindi confrontarlo con 1 e SQL non gli interesserà. – DForck42

risposta

4

Potrei sbagliarmi ma dal suo aspetto, sembra che tu voglia solo controllare che non sia doc_id e protocol_id sono NULL?

Per ottenere questo è possibile aggiungere un vincolo di tabella .

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

Hai perfettamente ragione – adopilot

+0

+1, cosa stavo pensando, ma solo se fin_stavke.id è univoco, il che sembra un presupposto ragionevole in questo caso –

+1

@adopilot - stampato e incorniciato il tuo commento. Sarà utile la prossima volta che avrò una discussione con mia moglie. –

1

Ho sempre visto bit usato come 1 o 0. Mi sarei rimasto con quello. Tutti sapranno cosa stai facendo.

Questo vincolo influenzerà le prestazioni dei propri inserti ma non di molto poiché si sta cercando la chiave primaria della tabella. Probabilmente è la ricerca più economica che puoi fare.

2

userei

set @bit = 1 

è sicuro (assegnazione fedele a un po 'si sente male) e convertire solo sembra inutile.

1

Una variabile bit può essere impostato con un valore intero:

set @bit = 1 

A volte si vuole un valore po reale per evitare la conversione implicita, allora si può fare una conversione excplicit:

set @bit = cast(1 as bit) 

Quando lo si assegna a una variabile non c'è alcuna differenza pratica, ma in una query la conversione si verifica quando la query viene analizzata anziché quando viene eseguita. L'ho usato un paio di volte e ho avuto delle differenze nelle prestazioni reali.

Problemi correlati